如何使用 Grpc 流式传输数组?

How can I stream arrays with Grpc?

我想传输一个int64数组。
我查了一下如何使用它。在我的原型文件中,我要么需要一个流:

service myService {
    rpc GetValues(myRequest) returns (stream myResponse);
}

message myRequest {
}

message myResponse {
    int64 values = 1;
}

或重复回复:

message myRepeatedResponse {
    repeated int64 value = 1;
}

一种选择比另一种更好吗?
我的用例是我想从我的数据库中读取最新的 x 个条目并将这些值作为数组发送给我的客户端。
但是我不知道我应该怎么做,因为在 MyService.MyService.Base 的覆盖函数中分配值时,我只能传递类型 'long' 而不是 'long[]' 的值。

对于流与重复的问题,答案是:视情况而定。

两者的区别在于:

  • streaming 发送一条或多条消息(每条消息可能包含重复字段)
  • unary 发送包含重复字段的单个消息

所以,我认为你的决定是基于:

  • 服务器如何获取repeated字段
  • 消息的大小(包括正在发送的重复字段)
  • 消息的'integrity'

如果服务器无法一次性获取整个重复字段,那么你的答案就更简单了;服务器在获取消息(包括重复字段)时需要对其进行流式处理。

根据消息的 'integrity',将消息分解为多个(流式传输)是有问题的。如果重复字段必须作为单个块传输,几乎作为事务单元传输,那么我认为您可能更愿意不将消息作为块传输。

您还应该考虑对您的客户造成的后果。您的客户是否能够收到一条较大的消息,或者是否会首选许多较小的消息,例如资源受限的 IoT SoC 设备。

否则,如果单个消息很大1,那么您需要将它们分解成更小的'bites'并流式传输。

1: Large Data Set 并注意每条消息有 2GB 的硬限制。