-
Notifications
You must be signed in to change notification settings - Fork 26.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
客户端与服务端payload参数不一致,服务端响应数据包长度超出客户端payload时的问题 #7021
Comments
你是如何在客户端指定 payload 参数的? |
客户端通过serUrl(dubbo://host:port?payload=xxxx)l直连的客户端, |
@SeanHongXing 确实有问题,并且打印出异常后,还收到了数据,打印了这个异常:Dubbo client can not supported string message |
嗯是这样的,可以稳定重现,这个我认为可能是dubbo没有处理好这种场景,实际应用中如果使用不当也是有可能发生这种问题。服务端数据包发完问题倒是不大,只是占用点带宽,但客户端等待超时这个影响就比较大了,集群配置下,还可能会多次重试 |
我认为可以在 HeaderExchangeHandler 的 caught 方法中对 ExceedPayloadLimitException 异常进行处理,来修复此问题。 |
@SeanHongXing 你在测的时候遇到了 Dubbo client can not supported string message 这个异常没? |
日志里会打印,应该是服务端后续的数据包被当做没有协议头的数据了 |
应该不是这个问题,我看了下 url 还是带有 payload 参数的 |
哪个不是这个问题?
这个吗? |
我看到第二次收到数据,包长度增加了,正常的包应该是 870 字节,但是第二次收到了 887 字节 |
这个应该是正解,最后走 telnetCodec 了,所以会报 Dubbo client can not supported string message 这个错 |
是的,没走到ExchangeCodec,后续的数据包当成telnet数据包了,直接就丢弃了 |
…tent, and the server response packet length exceeds the client payload.
…tent, and the server response packet length exceeds the client payload. (cherry picked from commit 86d00b5)
This issue has been handled on #7287 &READY-TO-CLOSE& |
Environment
Steps to reproduce this issue
server
client
Expected Result
客户端直接抛出ExceedPayloadLimitException
Actual Result
客户端等待超时时间,提示RemoteTimeoutException
实际抓包结果:
问题定位
服务端返回响应时,协议头中声明了数据包长度,客户端接收响应通过ExchangeCodec.decode()解码,在该方法中调用了checkPayload()方法,checkPayload()直接抛出ExceedPayloadLimitException,该异常最终由netty处理,dubbo没有将服务端的响应对应到之前的请求上,且没有将异常信息反馈给服务端,服务端依旧发送响应数据包,客户端接收后直接丢弃。
影响
发生于客户端指定dubbo协议payload的情形,当客户端payload与服务端payload参数不一致时,服务端响应数据包长度大于客户端payload,客户端未正确处理数据包超出payload的异常。最终导致客户端超时等待,且服务端依旧将数据包发送完,浪费网络开销,客户端调用方被阻塞至超时。
The text was updated successfully, but these errors were encountered: