Go语言 grpc:接收到的消息大于max(8653851 vs. 4194304)

gpnt7bae  于 2023-10-14  发布在  Go
关注(0)|答案(3)|浏览(292)

问题

我在grpc中接收消息时收到此错误:
rpc error: code = ResourceExhausted desc = grpc: received message larger than max (8653851 vs. 4194304)

我尝试的内容:

我给了选项来增加要接收的消息的大小,但它仍然给出了相同的错误,这意味着最大大小的设置不起作用:

size := 1024 * 1024 * 12
opts = append(opts, grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(size)))
conn, err := grpc.Dial(address, opts...)

留言内容:

默认限制为1024 * 1024 * 4 = 4194304,显示在错误消息中。我希望这个限制增加到1024 * 1024 * 12 = 12582912,但显然没有。

hs1rzwqc

hs1rzwqc1#

请尝试在您的客户端上更新grpc.MaxCallSendMsgSize(s int)以使您的客户端能够发送更大的消息。这对我很有效。

ni65a41a

ni65a41a2#

每个请求都可以传递调用选项。
例如,如果你的包名为queue,你的方法名为GetItems,那么在调用GetItems时,你应该传入MaxCallRecvMsgSize选项。
Protobuf:

package queue;

service Queue {
    rpc GetItems (Request) returns (Items) {
    }
}

转到:

conn, err := grpc.Dial(address, opts...)
c := queue.NewQueueClient(s.Conn)
maxSizeOption := grpc.MaxCallRecvMsgSize(32*10e6)
items, err := c.GetItems(ctx, &queue.Request{}, maxSizeOption)
i34xakig

i34xakig3#

我遇到了同样的问题。下面的DialOption将MaxCallRecvMsgSize设置为math.MaxInt64。但它不起作用。
原因是当客户端调用GRPC函数时,追加的grpc.WithChainUnaryInterceptor(chains...)会首先执行,客户端会跳过grpc. WithDefaultCallOptions。因此,您应该在链中设置MaxCallRecvMsgSize或删除grpc.WithChainUnaryInterceptor

func NewClient() (promotion.PromotionClient, error) {
    conn, err := grpc.Dial("address", DialogOptions()...)
    if err != nil {
        return nil, err
    }
    return promotion.NewPromotionClient(conn), nil
}

func DialogOptions(chains ...grpc.UnaryClientInterceptor) []grpc.DialOption {
    chains = append(chains, userinfo.UnaryClientInterceptor())
    return []grpc.DialOption{
        grpc.WithDefaultCallOptions(
            grpc.MaxCallRecvMsgSize(math.MaxInt64),
            grpc.MaxCallSendMsgSize(math.MaxInt64),
        ),
        grpc.WithChainUnaryInterceptor(chains...),
    }
}

相关问题