go resource_error ai_generated true

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

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

Also available as: JSON · Markdown · 中文
80%Fix Rate
88%Confidence
0Evidence
2024-04-22First Seen

Version Compatibility

VersionStatusIntroducedDeprecatedNotes
google.golang.org/grpc 1.x active

Root Cause

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

中文

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

Workarounds

  1. 90% success
    // server
    s := grpc.NewServer(grpc.MaxRecvMsgSize(16 * 1024 * 1024))
    // client
    conn, _ := grpc.Dial(addr, grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(16*1024*1024)))
  2. 85% success
    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()

Dead Ends

Common approaches that don't work:

  1. 75% fail

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

  2. 60% fail

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