Как я могу отправить сообщение многих полей с потоком c ++ grp c? - PullRequest
0 голосов
/ 05 марта 2020

Предположим, что сообщение, которое мне нужно отправить с сервера на клиент, выглядит следующим образом:

message BatchReply {
    bytes data = 1;
    repeated int32 shape = 2;
    string dtype = 3;
    repeated int64 labels = 4;
}

Здесь shape / dtype - это только небольшие переменные, которые могут быть представлены с небольшим интервалом int, data / labels - это большие буферы памяти, которые могут занимать до 1 ГБ памяти.

Я пытаюсь отправить это сообщение с помощью потока:

service ImageService {
    rpc get_batch (BatchRequest) returns (stream BatchReply) {}
}

Мой вопрос заключается в том, что примеры, которые я могу найти для отправки сообщения через поток, касаются только сообщений с одним полем в сообщении. struct, например:

service TransferFile {
    rpc Upload(stream Chunk) returns (Reply) {}
}
message Chunk {
    bytes buffer = 1; // here is only on field of buffer, what if there is a field of int val = 2; ?
}

Что если в структуре Chunk есть два поля. Нужно ли мне звонить set_val() каждый раз, когда я звоню set_buffer() во время того же процесса подачи потока?

1 Ответ

0 голосов
/ 05 марта 2020

Вы можете просто отправить сообщение с несколькими полями через grp c. Это преимущество использования protobuf.

Я не знаю, способен ли используемый вами уровень передачи обрабатывать такое большое сообщение, как вы указываете. Вы можете проверить это. Если это не сработает, вы можете использовать приведенный вами пример TransferFile.

При взгляде на Chunk создается впечатление, что они отправляют сегменты целых данных. С другой стороны они затем реконструируют сегменты в полный набор. Тип, используемый для Chunk - это байты. Это просто необработанные байты и могут представлять все, что вы хотите.

Чтобы отправить BatchReply порциями, вы можете использовать следующие шаги:

  1. Установить данные в BatchReply объекте.
  2. Сериализировать объект в байтовый массив.
  3. Установить часть байтового массива в объекте Chunk. Например, каждый раз по 100 байт.
  4. Отправьте объект Chunk с помощью интерфейса TransferFile.
  5. Повторяйте процесс, начиная с шага 3., пока не достигнете конца байтового массива.

На приемной стороне вы объединяете фрагменты в один массив и десериализуете массив обратно в объект BatchReply.

...