在工作中遇到了 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 的单条消息上限在流式通信中同样生效。遇到大消息收不到的问题时,先确认消息传递的方向,再分别在发送端和接收端调大对应的消息大小上限。