我正在创建客户端流方法,该方法的原型文件定义应该看起来像这样:
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
,服务器实现将终止流,这对我来说听起来不错。
下面是上述模式在grpc-lb-v1
中的用法。尽管grpc团队正在远离grpc-lb-v1
,但上面提到的模式是一种常用的模式。
我不太确定它对原型编组的含义。这可能是protobuf
团队的一个问题。
希望对你有帮助。