RPC 系列(十):gRPC 流式消息的大小限制

在工作中遇到了 gRPC 的 stream 通信(server 通过 stream 向 client 返回一个消息的 stream)中 client 收不到消息的情况。排查发现,收不到的这条消息比较大,跟同事讨论后认为,可能是 gRPC 限制了消息的大小,通常是 4MB。

网上搜索了一下,大多数是 Go 的解决方案,和 C++ 的接口名称不太一样。能查到的 C++ 相关资料大多只写了 server 端的 message size 设置,在我的代码中照此尝试之后,发现还是不能成功收到消息。最后根据我所用版本的源码,发现 client 连接时也需要做相关设置。本文给出的方法在我的环境下是可用的,但不确定是不是官方推荐的最佳方法,毕竟我没有找到官方的文档来说明这件事情。

server 端:设置最大发送消息大小

server 端在启动时,对 ServerBuilder 调用 SetMaxSendMessageSize,放大允许发送的消息大小上限。

client 端:设置最大接收消息大小

client 端在连接时,使用 CreateCustomChannel 这个接口来创建 channel,传入自定义的 ChannelArguments 对象,并在其中设置最大接收消息大小。

注意发送与接收的方向

需要注意的是,在我的场景下,是 server 通过 stream 向 client 发送大消息,所以对 server 来说,是设置最大发送大小;对 client 来说,是设置最大接收大小。如果是反过来的场景(client 向 server 发送大消息),则应该把两个设置替换过来:client 端设置最大发送大小,server 端通过 SetMaxReceiveMessageSize 设置最大接收大小。

小结

gRPC 默认约 4MB 的单条消息上限在流式通信中同样生效。遇到大消息收不到的问题时,先确认消息传递的方向,再分别在发送端和接收端调大对应的消息大小上限。

系列导航


   转载规则


《RPC 系列(十):gRPC 流式消息的大小限制》 由 吴杭沉 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
RPC 系列(十一):gRPC 大数据量消息传递 RPC 系列(十一):gRPC 大数据量消息传递
本文探讨 gRPC 中大数据量消息的传输限制及相应的两种解决方法:修改限制值大小和流式数据传输,并给出 gRPC C++ 版本下采用流式数据传输的示例,同时说明如何在 Visual Studio 下进行 proto 文件编写、编译以及 gR
2023-11-14
下一篇 
RPC 系列(九):gRPC 的 deadline 语义 RPC 系列(九):gRPC 的 deadline 语义
最近在将应用的 RPC 更换为 gRPC,使用过程中发现报错 rpc error: code = DeadlineExceeded desc = context deadline exceeded。这是啥?原来是某位仁兄设置了环境的超时时间
2023-10-31
  目录