带有初始参数的 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
团队的一个问题。
希望这对您有所帮助。
我正在创建客户端流式传输方法,其原型文件定义应与此类似:
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
团队的一个问题。
希望这对您有所帮助。