dubbo報錯Data length too large: 10710120處理,及服務提供者協議配置詳細說明


工作中遇到以下報錯信息

 

[plain] view plain copy
  1. cause: java.io.IOException: Data length too large: 10710120, max payload: 8388608, channel: NettyChannel [channel=[id: 0x09396776, /10.195.2.51:48887 => /10.195.2.21:20881]]  
  2. java.io.IOException: Data length too large: 10710120, max payload: 8388608, channel: NettyChannel [channel=[id: 0x09396776, /10.195.2.51:48887 => /10.195.2.21:20881]]  
  3.     at com.alibaba.dubbo.remoting.transport.AbstractCodec.checkPayload(AbstractCodec.java:49)  
  4.     at com.alibaba.dubbo.remoting.exchange.codec.ExchangeCodec.encodeResponse(ExchangeCodec.java:285)  
  5.     at com.alibaba.dubbo.remoting.exchange.codec.ExchangeCodec.encode(ExchangeCodec.java:77)  
  6.     at com.alibaba.dubbo.rpc.protocol.dubbo.DubboCountCodec.encode(DubboCountCodec.java:39)  
  7.     at com.alibaba.dubbo.remoting.transport.netty.NettyCodecAdapter$InternalEncoder.encode(NettyCodecAdapter.java:81)  


原因:

當dubbo服務提供層向消費層傳輸大數據容量的對象時,會受到Dubbo的限制,報類似如下異常:

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(默認為8M,即8388608)

 

第二種方案

再dubbo-provider.xml文件配置(下文有服務提供者協議配置詳細說明)

<dubbo:provider id="payload" payload="11557050"/>

 

第三種方案


1、在項目中集成MongoDB;

2、在service層把大容量數據存放到MongoDB中;

3、在web層從MongoDB中取出大容量數據。

 

 
 
 
 

線程模型

http://dubbo.io/User+Guide-zh.htm 用戶指南>>線程模型
類似於數據庫的連接池

(+) (#)

事件處理線程說明
  • 如果事件處理的邏輯能迅速完成,並且不會發起新的IO請求,比如只是在內存中記個標識,則直接在IO線程上處理更快,因為減少了線程池調度。
  • 但如果事件處理邏輯較慢,或者需要發起新的IO請求,比如需要查詢數據庫,則必須派發到線程池,否則IO線程阻塞,將導致不能接收其它請求。
  • 如果用IO線程處理事件,又在事件處理過程中發起新的IO請求,比如在連接事件中發起登錄請求,會報“可能引發死鎖”異常,但不會真死鎖。
  • Dispatcher
    • all 所有消息都派發到線程池,包括請求,響應,連接事件,斷開事件,心跳等。
    • direct 所有消息都不派發到線程池,全部在IO線程上直接執行。
    • message 只有請求響應消息派發到線程池,其它連接斷開事件,心跳等消息,直接在IO線程上執行。
    • execution 只請求消息派發到線程池,不含響應,響應和其它連接斷開事件,心跳等消息,直接在IO線程上執行。
    • connection 在IO線程上,將連接斷開事件放入隊列,有序逐個執行,其它消息派發到線程池。
  • ThreadPool
    • fixed 固定大小線程池,啟動時建立線程,不關閉,一直持有。(缺省)
    • cached 緩存線程池,空閑一分鍾自動刪除,需要時重建。
    • limited 可伸縮線程池,但池中的線程數只會增長不會收縮。(為避免收縮時突然來了大流量引起的性能問題)。

 

配置如:

< dubbo:protocol name = "dubbo" dispatcher = "all" threadpool = "fixed" threads = "100" />

 

配置標簽

<dubbo:provider/>

<dubbo:protocol/>

例:

<!-- 當ProtocolConfig和ServiceConfig某屬性沒有配置時,采用此缺省值 -->
<dubbo:provider timeout="10000" threadpool="fixed" threads="100" accepts="1000" />

<dubbo:protocol/>

 

(+) (#)

服務提供者協議配置:
配置類:com.alibaba.dubbo.config.ProtocolConfig
說明:如果需要支持多協議,可以聲明多個<dubbo:protocol>標簽,並在<dubbo:service>中通過protocol屬性指定使用的協議。

標簽 屬性 對應URL參數 類型 是否必填 缺省值 作用 描述 兼容性
<dubbo:protocol> id   string 可選 dubbo 配置關聯 協議BeanId,可以在<dubbo:service protocol="">中引用此ID,如果ID不填,缺省和name屬性值一樣,重復則在name后加序號。 2.0.5以上版本
<dubbo:protocol> name <protocol> string 必填 dubbo 性能調優 協議名稱 2.0.5以上版本
<dubbo:protocol> port <port> int 可選 dubbo協議缺省端口為20880,rmi協議缺省端口為1099,http和hessian協議缺省端口為80 
如果配置為-1 或者 沒有配置port,則會分配一個沒有被占用的端口。Dubbo 2.4.0+,分配的端口在協議缺省端口的基礎上增長,確保端口段可控。
服務發現 服務端口 2.0.5以上版本
<dubbo:protocol> host <host> string 可選 自動查找本機IP 服務發現 -服務主機名,多網卡選擇或指定VIP及域名時使用,為空則自動查找本機IP,-建議不要配置,讓Dubbo自動獲取本機IP 2.0.5以上版本
<dubbo:protocol> threadpool threadpool string 可選 fixed 性能調優 線程池類型,可選:fixed/cached 2.0.5以上版本
<dubbo:protocol> threads threads int 可選 100 性能調優 服務線程池大小(固定大小) 2.0.5以上版本
<dubbo:protocol> iothreads threads int 可選 cpu個數+1 性能調優 io線程池大小(固定大小) 2.0.5以上版本
<dubbo:protocol> accepts accepts int 可選 0 性能調優 服務提供方最大可接受連接數 2.0.5以上版本
<dubbo:protocol> payload payload int 可選 88388608(=8M) 性能調優 請求及響應數據包大小限制,單位:字節 2.0.5以上版本
<dubbo:protocol> codec codec string 可選 dubbo 性能調優 協議編碼方式 2.0.5以上版本
<dubbo:protocol> serialization serialization string 可選 dubbo協議缺省為hessian2,rmi協議缺省為java,http協議缺省為json 性能調優 協議序列化方式,當協議支持多種序列化方式時使用,比如:dubbo協議的dubbo,hessian2,java,compactedjava,以及http協議的json等 2.0.5以上版本
<dubbo:protocol> accesslog accesslog string/boolean 可選   服務治理 設為true,將向logger中輸出訪問日志,也可填寫訪問日志文件路徑,直接把訪問日志輸出到指定文件 2.0.5以上版本
<dubbo:protocol> path <path> string 可選   服務發現 提供者上下文路徑,為服務path的前綴 2.0.5以上版本
<dubbo:protocol> transporter transporter string 可選 dubbo協議缺省為netty 性能調優 協議的服務端和客戶端實現類型,比如:dubbo協議的mina,netty等,可以分拆為server和client配置 2.0.5以上版本
<dubbo:protocol> server server string 可選 dubbo協議缺省為netty,http協議缺省為servlet 性能調優 協議的服務器端實現類型,比如:dubbo協議的mina,netty等,http協議的jetty,servlet等 2.0.5以上版本
<dubbo:protocol> client client string 可選 dubbo協議缺省為netty 性能調優 協議的客戶端實現類型,比如:dubbo協議的mina,netty等 2.0.5以上版本
<dubbo:protocol> dispatcher dispatcher string 可選 dubbo協議缺省為all 性能調優 協議的消息派發方式,用於指定線程模型,比如:dubbo協議的all, direct, message, execution, connection等 2.1.0以上版本
<dubbo:protocol> queues queues int 可選 0 性能調優 線程池隊列大小,當線程池滿時,排隊等待執行的隊列大小,建議不要設置,當線程程池時應立即失敗,重試其它服務提供機器,而不是排隊,除非有特殊需求。 2.0.5以上版本
<dubbo:protocol> charset charset string 可選 UTF-8 性能調優 序列化編碼 2.0.5以上版本
<dubbo:protocol> buffer buffer int 可選 8192 性能調優 網絡讀寫緩沖區大小 2.0.5以上版本
<dubbo:protocol> heartbeat heartbeat int 可選 0 性能調優 心跳間隔,對於長連接,當物理層斷開時,比如拔網線,TCP的FIN消息來不及發送,對方收不到斷開事件,此時需要心跳來幫助檢查連接是否已斷開 2.0.10以上版本
<dubbo:protocol> telnet telnet string 可選   服務治理 所支持的telnet命令,多個命令用逗號分隔 2.0.5以上版本
<dubbo:protocol> register register boolean 可選 true 服務治理 該協議的服務是否注冊到注冊中心 2.0.8以上版本
<dubbo:protocol> contextpath contextpath String 可選 缺省為空串 服務治理   2.0.6以上版本

Linux 用戶線程數限制導致的 java.lang.OutOfMemoryError: unable to create new native thread異常

系統默認最大的線程數為1024個

[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 
調整時要注意

 

 

1、 盡量不要使用 root 用戶來部署應用程序,避免資源耗盡后無法登錄操作系統。

 因為root用戶默認沒有限制線程數,如果線程過多,會使資源占用很多,導致不能關機,只能硬關機

2、 普通用戶的線程數限制值要看可用物理內存容量來配置

[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 ~]# 


 

 

計算方式:

 

default_nproc = total_memory/128K; 

cat /proc/meminfo |grep MemTotal

echo "2941144/128"|bc

ulimit -u

ulimit -a # 顯示目前資源限制的設定 

ulimit -u # 用戶最多可開啟的程序數目

 重啟,使之生效:# reboot


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM