go resource_error ai_generated true

rpc 错误:code = ResourceExhausted desc = grpc: 收到的消息大于最大值(5242881 对 4194304)

rpc error: code = ResourceExhausted desc = grpc: received message larger than max (5242881 vs. 4194304)

ID: go/grpc-resource-exhausted-message-too-large

其他格式: JSON · Markdown 中文 · English
80%修复率
88%置信度
0证据数
2024-04-22首次发现

版本兼容性

版本状态引入弃用备注
google.golang.org/grpc 1.x active

根因分析

gRPC 默认最大接收消息大小为 4MB。服务端或客户端收到的序列化消息超过了该限制。常见于 protobuf 中嵌入的大型 repeated 字段或二进制数据。

English

The default gRPC max receive message size is 4MB. The server or client received a serialized message exceeding this limit. Common with large repeated fields or blobs embedded in protobuf.

generic

解决方案

  1. 90% 成功率
    // server
    s := grpc.NewServer(grpc.MaxRecvMsgSize(16 * 1024 * 1024))
    // client
    conn, _ := grpc.Dial(addr, grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(16*1024*1024)))
  2. 85% 成功率
    stream, err := client.Upload(ctx)
    for _, chunk := range chunks {
        if err := stream.Send(&pb.Chunk{Data: chunk}); err != nil { return err }
    }
    resp, err := stream.CloseAndRecv()

无效尝试

常见但无效的做法:

  1. 75% 失败

    The limit applies to the decompressed message size on receive; compression does not change the post-decompression size.

  2. 60% 失败

    Without a defined chunking protocol (e.g., streaming with sequence numbers), the receiver cannot reconstruct the message.