grpc.MaxCallSendMsgSize最大可设字节数是多少?配置为何不生效?
问题根因说明
你遇到的4MB(4194304字节)是gRPC官方的默认单消息大小上限,服务端和客户端的默认收发限制都是这个值。grpc.MaxCallSendMsgSize 本身没有硬性最大字节限制,只要内存足够可以自定义任意值,不过生产环境不建议设置过大,避免大消息占满服务内存,超过100MB的消息更推荐用gRPC流式传输方案。
配置不生效的原因
你现在遇到的报错是对端的大小限制触发的,你只在客户端单次调用时传参不会生效,要区分报错来源调整对应配置:
- 如果报错是服务端侧输出:说明你客户端发送的请求超过了服务端的接收上限,需要在服务端初始化时配置全局大小参数
- 如果报错是客户端侧输出:说明服务端返回的响应超过了客户端的接收上限,优先在客户端建立连接时配置全局参数,比单次调用传参优先级更高、更稳妥
正确配置示例
服务端侧配置
maxMsgSize := 50 * 1024 * 1024 // 50MB s := grpc.NewServer( grpc.MaxRecvMsgSize(maxMsgSize), // 服务端最大可接收消息大小 grpc.MaxSendMsgSize(maxMsgSize), // 服务端最大可发送消息大小 // 其他服务端配置项,比如tls、拦截器等 )
客户端侧配置
maxMsgSize := 50 * 1024 * 1024 // 50MB conn, err := grpc.Dial( serverAddr, grpc.WithDefaultCallOptions( grpc.MaxCallSendMsgSize(maxMsgSize), // 客户端全局最大发送消息大小 grpc.MaxCallRecvMsgSize(maxMsgSize), // 客户端全局最大接收消息大小 ), // 其他拨号配置项,比如tls、拦截器等 ) grpcClient := pb.NewYourServiceClient(conn) // 后续调用无需再传单次大小参数 if _, err := grpcClient.Foo(request); err != nil { return err }
之前测试生效的原因说明
你给MaxCallSendMsgSize传10MB时触发的是客户端本地的发送前校验,所以会命中你设置的10MB限制,和服务端无关,这也是为什么两次测试的报错提示不一样。
内容的提问来源于stack exchange,提问作者Yashy
相关产品推荐
相关产品推荐

