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

How could I send message of many fields with c++ grpc stream?

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

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

这里shape/dtype只是小变量,可以用几个int表示space,而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_buffer()需要每次都调用set_val()吗?

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

我不知道您使用的传输层是否能够处理您指定的这么大的消息。你可以测试一下。如果这不起作用,您可以使用您给出的 TransferFile.

示例

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

要分块发送您的 BatchReply,您可以使用以下步骤:

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

在接收端,您将块连接成一个数组并将该数组反序列化回 BatchReply 对象。