今天有个业务反馈调用接口报错了,后来经过排查,发现是因为调用dubbo时响应的payload超过了限制

这是个分页到es查询的接口,参数很简单

但是由于索引中字段content是一个长字符串,参数中的size比较大,导致触发了dubbo payload的限制

后来查询服务日志,发现了很多类似的错误

其实这个接口限制单次查询的最大条数是500,但是因为该业务的单条数据比较大,导致300就已经触发限制了。
在接口交互时,参数的选择,要结合自身的数据特征
对于这类比较大的数据传输,其实可以考虑使用支持流式传输的方式,将大的参数或响应,拆分为多个,一次调用多次响应,one request - multi response,server-side streaming
dubbo3,GRPC,RSocket都支持流式的交互方式

RSocket交互模型中的

dubbo 2.x并不支持流式调用,dubbo3.0支持,但是3.0也是刚刚发布不就,前段时间看issues看到了一些关于流式调用的问题,因此可能还不太稳定,小心使用吧
Triple协议介绍
Triple Streaming 通信模式
riple协议SERVER_STREAM模式下,通过StreamObserver响应数据时,不能实时发送给客户端,而只能等到整个方法执行完后一起发
因之前也碰到过类似的问题, 有同学使用dubbo接口传输图片,也触发了payload的限制,因此当时也调研了一些支持流式调用的RPC,自己也写了个demo