1.问题描述
线上值班时,收到告警通知dubbo 调用异常。
主要报错包括下面两条记录:
[DUBBO] Dubbo client can not supported string message:
[ERROR] [New I/O client worker #1-3] com.alibaba.dubbo.remoting.transport.AbstractCodec - Data length too large: 1309029171, max payload: 12582912, channel: NettyChannel [channel=[id: 0x1ee887ea, /172.30.111.31:59428 => /10.96.10.168:20880]]
2.问题定位
- 通过链路日志发现是一个管理后台的接口报错,调用错误率整体不高,对应的代码最近也没有改动,排除是最近上线引起的bug.
- 看具体的报错日志,评估和接口的数据调用量有关系。当dubbo接口返回数据数据量太大,超过dubbo 协议中 payload 参数中的设置值时,会触发上述问题。后来通过具体排查操作日志,发现线上有接口在查询客户信息时,没有分页查询了全部,返回数据过大,产生了告警。
3.问题修复
修复问题时,有两条思路,一种是修改dubbo配置文件中payload 参数的设置,另一种是在调用查询接口时,分批调用,减小接口返回数据量。两种方案评估代码影响范围和测试范围后,决定采用第一种,先修改配置文件。具体修改方式参考:
<dubbo:provider timeout="${dubbo.provider.timeout}" retries="2" group="${dubbo.provider.group}" version="${dubbo.provider.version}" payload="83886080"/>
主要修改payload 参数。
修改以后,发现服务正常