dubbo报错Data length too large: 10710120处理,及服务提供者协议配置详细说明
工作中遇到以下報(bào)錯(cuò)信息
[plain]?view plain?copy
原因:
com.alibaba.dubbo.remoting.transport.AbstractCodec.checkPayload() ERROR?
Data length too large: 11557050, max payload: 8388608
java.io.IOException: Data length too large: 11557050, max payload: 8388608
解決方案如下,有兩種
第一種方案
修改提供方的dubbo配置,
在dubbo.properties 中增加如下
dubbo.protocol.dubbo.payload=11557050(默認(rèn)為8M,即8388608)
?
第二種方案
再dubbo-provider.xml文件配置(下文有服務(wù)提供者協(xié)議配置詳細(xì)說明)
<dubbo:provider id="payload" payload="11557050"/>?
?
第三種方案
1、在項(xiàng)目中集成MongoDB;
2、在service層把大容量數(shù)據(jù)存放到MongoDB中;
3、在web層從MongoDB中取出大容量數(shù)據(jù)。
線程模型
http://dubbo.io/User+Guide-zh.htm 用戶指南>>線程模型 類似于數(shù)據(jù)庫(kù)的連接池(+) (#)
事件處理線程說明
|
- Dispatcher
- all 所有消息都派發(fā)到線程池,包括請(qǐng)求,響應(yīng),連接事件,斷開事件,心跳等。
- direct 所有消息都不派發(fā)到線程池,全部在IO線程上直接執(zhí)行。
- message 只有請(qǐng)求響應(yīng)消息派發(fā)到線程池,其它連接斷開事件,心跳等消息,直接在IO線程上執(zhí)行。
- execution 只請(qǐng)求消息派發(fā)到線程池,不含響應(yīng),響應(yīng)和其它連接斷開事件,心跳等消息,直接在IO線程上執(zhí)行。
- connection 在IO線程上,將連接斷開事件放入隊(duì)列,有序逐個(gè)執(zhí)行,其它消息派發(fā)到線程池。
- ThreadPool
- fixed 固定大小線程池,啟動(dòng)時(shí)建立線程,不關(guān)閉,一直持有。(缺省)
- cached 緩存線程池,空閑一分鐘自動(dòng)刪除,需要時(shí)重建。
- limited 可伸縮線程池,但池中的線程數(shù)只會(huì)增長(zhǎng)不會(huì)收縮。(為避免收縮時(shí)突然來了大流量引起的性能問題)。
?
配置如:
| <dubbo:protocolname="dubbo"dispatcher="all"threadpool="fixed"threads="100"/> |
?
配置標(biāo)簽
<dubbo:provider/>
<dubbo:protocol/>
例:
<!-- 當(dāng)ProtocolConfig和ServiceConfig某屬性沒有配置時(shí),采用此缺省值 -->
<dubbo:provider timeout="10000" threadpool="fixed" threads="100" accepts="1000" />
<dubbo:protocol/>
?
(+) (#)
服務(wù)提供者協(xié)議配置:
配置類:com.alibaba.dubbo.config.ProtocolConfig
說明:如果需要支持多協(xié)議,可以聲明多個(gè)<dubbo:protocol>標(biāo)簽,并在<dubbo:service>中通過protocol屬性指定使用的協(xié)議。
| <dubbo:protocol> | id | ? | string | 可選 | dubbo | 配置關(guān)聯(lián) | 協(xié)議BeanId,可以在<dubbo:service protocol="">中引用此ID,如果ID不填,缺省和name屬性值一樣,重復(fù)則在name后加序號(hào)。 | 2.0.5以上版本 |
| <dubbo:protocol> | name | <protocol> | string | 必填 | dubbo | 性能調(diào)優(yōu) | 協(xié)議名稱 | 2.0.5以上版本 |
| <dubbo:protocol> | port | <port> | int | 可選 | dubbo協(xié)議缺省端口為20880,rmi協(xié)議缺省端口為1099,http和hessian協(xié)議缺省端口為80? 如果配置為-1?或者?沒有配置port,則會(huì)分配一個(gè)沒有被占用的端口。Dubbo?2.4.0+,分配的端口在協(xié)議缺省端口的基礎(chǔ)上增長(zhǎng),確保端口段可控。 | 服務(wù)發(fā)現(xiàn) | 服務(wù)端口 | 2.0.5以上版本 |
| <dubbo:protocol> | host | <host> | string | 可選 | 自動(dòng)查找本機(jī)IP | 服務(wù)發(fā)現(xiàn) | -服務(wù)主機(jī)名,多網(wǎng)卡選擇或指定VIP及域名時(shí)使用,為空則自動(dòng)查找本機(jī)IP,-建議不要配置,讓Dubbo自動(dòng)獲取本機(jī)IP | 2.0.5以上版本 |
| <dubbo:protocol> | threadpool | threadpool | string | 可選 | fixed | 性能調(diào)優(yōu) | 線程池類型,可選:fixed/cached | 2.0.5以上版本 |
| <dubbo:protocol> | threads | threads | int | 可選 | 100 | 性能調(diào)優(yōu) | 服務(wù)線程池大小(固定大小) | 2.0.5以上版本 |
| <dubbo:protocol> | iothreads | threads | int | 可選 | cpu個(gè)數(shù)+1 | 性能調(diào)優(yōu) | io線程池大小(固定大小) | 2.0.5以上版本 |
| <dubbo:protocol> | accepts | accepts | int | 可選 | 0 | 性能調(diào)優(yōu) | 服務(wù)提供方最大可接受連接數(shù) | 2.0.5以上版本 |
| <dubbo:protocol> | payload | payload | int | 可選 | 88388608(=8M) | 性能調(diào)優(yōu) | 請(qǐng)求及響應(yīng)數(shù)據(jù)包大小限制,單位:字節(jié) | 2.0.5以上版本 |
| <dubbo:protocol> | codec | codec | string | 可選 | dubbo | 性能調(diào)優(yōu) | 協(xié)議編碼方式 | 2.0.5以上版本 |
| <dubbo:protocol> | serialization | serialization | string | 可選 | dubbo協(xié)議缺省為hessian2,rmi協(xié)議缺省為java,http協(xié)議缺省為json | 性能調(diào)優(yōu) | 協(xié)議序列化方式,當(dāng)協(xié)議支持多種序列化方式時(shí)使用,比如:dubbo協(xié)議的dubbo,hessian2,java,compactedjava,以及http協(xié)議的json等 | 2.0.5以上版本 |
| <dubbo:protocol> | accesslog | accesslog | string/boolean | 可選 | ? | 服務(wù)治理 | 設(shè)為true,將向logger中輸出訪問日志,也可填寫訪問日志文件路徑,直接把訪問日志輸出到指定文件 | 2.0.5以上版本 |
| <dubbo:protocol> | path | <path> | string | 可選 | ? | 服務(wù)發(fā)現(xiàn) | 提供者上下文路徑,為服務(wù)path的前綴 | 2.0.5以上版本 |
| <dubbo:protocol> | transporter | transporter | string | 可選 | dubbo協(xié)議缺省為netty | 性能調(diào)優(yōu) | 協(xié)議的服務(wù)端和客戶端實(shí)現(xiàn)類型,比如:dubbo協(xié)議的mina,netty等,可以分拆為server和client配置 | 2.0.5以上版本 |
| <dubbo:protocol> | server | server | string | 可選 | dubbo協(xié)議缺省為netty,http協(xié)議缺省為servlet | 性能調(diào)優(yōu) | 協(xié)議的服務(wù)器端實(shí)現(xiàn)類型,比如:dubbo協(xié)議的mina,netty等,http協(xié)議的jetty,servlet等 | 2.0.5以上版本 |
| <dubbo:protocol> | client | client | string | 可選 | dubbo協(xié)議缺省為netty | 性能調(diào)優(yōu) | 協(xié)議的客戶端實(shí)現(xiàn)類型,比如:dubbo協(xié)議的mina,netty等 | 2.0.5以上版本 |
| <dubbo:protocol> | dispatcher | dispatcher | string | 可選 | dubbo協(xié)議缺省為all | 性能調(diào)優(yōu) | 協(xié)議的消息派發(fā)方式,用于指定線程模型,比如:dubbo協(xié)議的all, direct, message, execution, connection等 | 2.1.0以上版本 |
| <dubbo:protocol> | queues | queues | int | 可選 | 0 | 性能調(diào)優(yōu) | 線程池隊(duì)列大小,當(dāng)線程池滿時(shí),排隊(duì)等待執(zhí)行的隊(duì)列大小,建議不要設(shè)置,當(dāng)線程程池時(shí)應(yīng)立即失敗,重試其它服務(wù)提供機(jī)器,而不是排隊(duì),除非有特殊需求。 | 2.0.5以上版本 |
| <dubbo:protocol> | charset | charset | string | 可選 | UTF-8 | 性能調(diào)優(yōu) | 序列化編碼 | 2.0.5以上版本 |
| <dubbo:protocol> | buffer | buffer | int | 可選 | 8192 | 性能調(diào)優(yōu) | 網(wǎng)絡(luò)讀寫緩沖區(qū)大小 | 2.0.5以上版本 |
| <dubbo:protocol> | heartbeat | heartbeat | int | 可選 | 0 | 性能調(diào)優(yōu) | 心跳間隔,對(duì)于長(zhǎng)連接,當(dāng)物理層斷開時(shí),比如拔網(wǎng)線,TCP的FIN消息來不及發(fā)送,對(duì)方收不到斷開事件,此時(shí)需要心跳來幫助檢查連接是否已斷開 | 2.0.10以上版本 |
| <dubbo:protocol> | telnet | telnet | string | 可選 | ? | 服務(wù)治理 | 所支持的telnet命令,多個(gè)命令用逗號(hào)分隔 | 2.0.5以上版本 |
| <dubbo:protocol> | register | register | boolean | 可選 | true | 服務(wù)治理 | 該協(xié)議的服務(wù)是否注冊(cè)到注冊(cè)中心 | 2.0.8以上版本 |
| <dubbo:protocol> | contextpath | contextpath | String | 可選 | 缺省為空串 | 服務(wù)治理 | ? | 2.0.6以上版本 |
Linux?用戶線程數(shù)限制導(dǎo)致的?java.lang.OutOfMemoryError:?unable?to?create?new?native?thread異常
系統(tǒng)默認(rèn)最大的線程數(shù)為1024個(gè)
[root@edu-provider-01 ~]# cat /etc/security/limits.d/90-nproc.conf?
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.
* ? ? ? ? ?soft ? ?nproc ? ??1024
root ? ? ? soft ? ?nproc ? ? unlimited
[root@edu-provider-01 ~]# vi /etc/security/limits.d/90-nproc.conf?
調(diào)整時(shí)要注意:
?
?
1、?盡量不要使用?root?用戶來部署應(yīng)用程序,避免資源耗盡后無法登錄操作系統(tǒng)。
?因?yàn)閞oot用戶默認(rèn)沒有限制線程數(shù),如果線程過多,會(huì)使資源占用很多,導(dǎo)致不能關(guān)機(jī),只能硬關(guān)機(jī)
2、?普通用戶的線程數(shù)限制值要看可用物理內(nèi)存容量來配置
[root@edu-provider-01 ~]# cat /proc/meminfo |grep MemTotal?
MemTotal: ? ? ? ?2941144 kB
[root@edu-provider-01 ~]# echo "2941144/128"|bc
22977
[root@edu-provider-01 ~]# ulimit -u
1024
[1]+ ?Stopped ? ? ? ? ? ? ? ? vi /etc/security/limits.d/90-nproc.conf
[root@edu-provider-01 ~]# vi /etc/security/limits.d/90-nproc.conf?
[root@edu-provider-01 ~]# cat /etc/security/limits.d/90-nproc.conf?
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.
* ? ? ? ? ?soft ? ?nproc ? ? 12000
root ? ? ? soft ? ?nproc ? ? unlimited
[root@edu-provider-01 ~]#?
?
?
?
計(jì)算方式:
?
default_nproc?=?total_memory/128K;?
$?cat?/proc/meminfo?|grep?MemTotal
$?echo "2941144/128"|bc
$?ulimit?-u
ulimit?-a?#?顯示目前資源限制的設(shè)定?
ulimit?-u?#?用戶最多可開啟的程序數(shù)目
?重啟,使之生效:#?reboot
轉(zhuǎn)載于:https://www.cnblogs.com/exmyth/p/8745306.html
總結(jié)
以上是生活随笔為你收集整理的dubbo报错Data length too large: 10710120处理,及服务提供者协议配置详细说明的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux epoll 笔记(高并发事件
- 下一篇: 前端,标签