我如何使用c ++ grpc流发送许多字段的消息?

问题描述 投票:0回答:1

假设我需要从服务器发送到客户端的消息是这样的:

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

这里shape / dtype只是小变量,可以用几个整数空间表示,而data / labels是大内存缓冲区,最多可以占用1G内存。

我正在尝试通过流发送此消息:

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

我的问题是,我可以找到通过流发送消息的示例都是关于消息结构中只有一个字段的消息,例如:

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()

c++ stream protocol-buffers grpc
1个回答
0
投票

您可以通过grpc发送带有多个字段的消息。这就是使用protobuf的优势。

我不知道您使用的传输层是否能够处理您指定的大消息。您可以测试一下。如果这不起作用,则可以使用您提供的TransferFile示例。

[查看Chunk时,我得到的印象是他们正在发送全部数据的片段。另一方面,他们然后将这些段重构为完整的集合。用于Chunk的类型是字节。这些只是原始字节,可以代表您想要的任何内容。

要分批发送BatchReply,可以使用以下步骤:

  1. BatchReply对象中设置数据。
  2. 将对象序列化为字节数组。
  3. Chunk对象中设置字节数组的一部分。例如,每次100个字节。
  4. 使用Chunk接口发送TransferFile对象。
  5. 重复步骤3的过程,直到到达字节数组的末尾。

在接收端,将块连接到一个数组中,然后将该数组反序列化为BatchReply对象。

© www.soinside.com 2019 - 2024. All rights reserved.