Как измерить размер ответа gRPC

Я пытаюсь придумать лучшие способы справиться с ограничением размера сообщения 4 МБ в grpc. Мне нужен способ измерить размер ответа grpc, полученного на стороне клиента. Когда ответ превышает ограничение в 4 МБ, grpc показывает сообщение об ошибке, например:

не удалось приветствовать: ошибка rpc: code = ResourceExhausted desc = grpc: получено сообщение больше, чем max (74000087 против 4194304)

где «74000087» - это фактический размер ответа. Как это рассчитывается? Есть ли способ получить это значение?

Я просмотрел несколько статей по этой теме, но ничего не нашел? Может кто-нибудь помочь? Спасибо.

Моя реализация использует golang


person Ashwin Shirva    schedule 09.12.2019    source источник


Ответы (2)


Вычисление размера сообщения

Согласно протоколам,

func Size(m Message) int

Размер возвращает размер в байтах кодировки m в проводном формате.

ограничения на размер сообщения gRPC

Кроме того, в вашем случае может быть полезно рассмотреть возможность установки grpc.MaxCallRecvMsgSize как grpc.CallOption управлять лимитами.

person Dustin Hooten    schedule 05.06.2020

Я придумал, как это сделать. Решение состоит в том, чтобы закодировать ответ gRPC в поток byte, а затем вычислить размер с помощью binary.Size()

func GetGRPCResponseSize(val interface{}, desc string) (int, error) {

    var buff bytes.Buffer
    enc := gob.NewEncoder(&buff)
    err := enc.Encode(val)
    if err != nil {
        log.Error("encode error:", err)
        return 0, err
    }
    return binary.Size(buff.Bytes()), nil
}
person Ashwin Shirva    schedule 11.12.2019