dubbo报错Data length too large 10710120处理,及服务提供者协议配置详细说明

工作中遇到以下报错信息

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]]
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]]
	at com.alibaba.dubbo.remoting.transport.AbstractCodec.checkPayload(AbstractCodec.java:49)
	at com.alibaba.dubbo.remoting.exchange.codec.ExchangeCodec.encodeResponse(ExchangeCodec.java:285)
	at com.alibaba.dubbo.remoting.exchange.codec.ExchangeCodec.encode(ExchangeCodec.java:77)
	at com.alibaba.dubbo.rpc.protocol.dubbo.DubboCountCodec.encode(DubboCountCodec.java:39)
	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 用户指南>>线程模型

类似于数据库的连接池

(+) (#)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q0uPO9s9-1662081496213)(http://dubbo.io/dubbo-protocol.jpg-version=1&modificationDate=1331068241000.jpg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nUhTs5Gw-1662081496214)(http://dubbo.io/check.gif)]

事件处理线程说明

  • 如果事件处理的逻辑能迅速完成,并且不会发起新的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/

例:

<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

string

必填

dubbo

性能调优

协议名称

2.0.5以上版本

dubbo:protocol

port

int

可选

dubbo协议缺省端口为20880,rmi协议缺省端口为1099,http和hessian协议缺省端口为80
如果配置为-1或者没有配置port,则会分配一个没有被占用的端口。Dubbo2.4.0+,分配的端口在协议缺省端口的基础上增长,确保端口段可控。

服务发现

服务端口

2.0.5以上版本

dubbo:protocol

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

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:unabletocreatenewnativethread异常

系统默认最大的线程数为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|grepMemTotal

$echo “2941144/128”|bc

$ulimit-u

ulimit-a#显示目前资源限制的设定

ulimit-u#用户最多可开启的程序数目

重启,使之生效:#reboot

t

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值