带有初始参数的 gRPC 客户端流

gRPC client-side streaming with initial arguments

我正在创建客户端流式传输方法,其原型文件定义应与此类似:

service DataService {
    rpc Send(stream SendRequest) returns (SendResponse) {}
}
 
message SendRequest {
    string id = 1;
    bytes data = 2;
}
 
message SendResponse {
}

这里的问题是,即使只需要一次,ID 也会随每条流媒体消息一起发送。对于此类用例,您的建议和最佳方式是什么? 一种骇人听闻的方法是在第一条消息中仅设置一次 ID,如果为空则留下。但是这个 API 应该被第三方使用,像上面这样的方法定义并没有很好地解释。 我认为也不支持这样的东西:

service DataService {
    rpc Send(InitialSendRequest, stream DataOnlyRequest) returns (SendResponse) {}
}

我目前正在考虑 SendRequest 消息是这样的,但是与第一个考虑原型封送处理的情况相比,我必须检查这有多优化:

message SendRequest {
  oneof request{
    string id = 1;
    bytes data = 2;
  }
}

您使用 oneof 并在字段中明确记录为 id 的方法预计只会出现在流中的第一条消息中,并且如果 id 服务器实现将终止流在流中的后续消息上设置对我来说听起来不错。

following 是上述模式在 grpc-lb-v1 中的用法。尽管 grpc 团队正在远离 grpc-lb-v1,但上述模式是常用的模式。

我不太确定它对原型编组的影响。这可能是 protobuf 团队的一个问题。

希望这对您有所帮助。