如何使用Grpc流式传输数组



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

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[]"。

对于流与重复问题,答案是:这取决于。

两者的区别在于:

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

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

  • 服务器如何获取重复字段
  • 消息的大小(包括正在发送的重复字段(
  • 消息的"完整性">

如果服务器无法一次性获得整个重复字段,则您的答案更简单;服务器将需要在获得消息时对消息进行流式传输(包括重复字段(。

根据消息的"完整性",将消息分解为多个(流式传输(是否存在问题。如果重复字段必须作为单个块来传输,几乎是作为事务单元来传输,那么我认为您可能更喜欢不将消息作为块进行流式传输。

您还应该考虑对您的客户造成的后果。您的客户是否能够接收一条较大的消息,或者是否更喜欢许多较小的消息,例如资源受限的物联网SoC设备。

否则,如果单个消息较大1,则您需要将它们分解为较小的"片段"并进行流式传输。

1:大型数据集,注意有2GB/消息的硬限制。

最新更新