GRPC:带有配置消息的客户端流式传输
GRPC: Client streaming with configuration message
这是使用事件流的服务的原型定义
来自客户
message Event {
// ...
}
service EventService {
rpc Publisher(stream Event) returns (google.protobuf.Empty);
}
问题是需要告诉服务器如何处理这个流。
理想情况下,它会首先收到 Options
消息:
message Event {
// ...
}
message Options {
// ...
}
service EventService {
rpc Publisher(Options, stream Event) returns (google.protobuf.Empty);
}
然而,grpc 只支持 rpc
方法的一个参数。
一种解决方案是引入一个额外的 PublishMessage
消息,它
可以包含 Options
或 Event
消息。
message PublishMessage {
oneof content {
Options options = 1;
Event event = 2;
}
}
该服务将期望第一个 PublishMessage
包含一条 Options
消息,所有后续消息都包含 Event
消息。这从包装消息中引入了额外的开销,并使 api 有点笨拙。
是否有更简洁的方法来达到相同的结果?
当有许多字段或消息在播放时,建议使用 oneof
方法。开销很小,所以通常不会是一个问题。不过还是有点笨拙。
如果只有几个字段,您可能希望将选项和事件中的字段合并到一条消息中。或者类似地将选项作为字段添加到事件。您希望 Options 字段出现在第一个请求中,而在后续请求中丢失。当配置字段较少时效果更好,比如 "name."
这是使用事件流的服务的原型定义 来自客户
message Event {
// ...
}
service EventService {
rpc Publisher(stream Event) returns (google.protobuf.Empty);
}
问题是需要告诉服务器如何处理这个流。
理想情况下,它会首先收到 Options
消息:
message Event {
// ...
}
message Options {
// ...
}
service EventService {
rpc Publisher(Options, stream Event) returns (google.protobuf.Empty);
}
然而,grpc 只支持 rpc
方法的一个参数。
一种解决方案是引入一个额外的 PublishMessage
消息,它
可以包含 Options
或 Event
消息。
message PublishMessage {
oneof content {
Options options = 1;
Event event = 2;
}
}
该服务将期望第一个 PublishMessage
包含一条 Options
消息,所有后续消息都包含 Event
消息。这从包装消息中引入了额外的开销,并使 api 有点笨拙。
是否有更简洁的方法来达到相同的结果?
当有许多字段或消息在播放时,建议使用 oneof
方法。开销很小,所以通常不会是一个问题。不过还是有点笨拙。
如果只有几个字段,您可能希望将选项和事件中的字段合并到一条消息中。或者类似地将选项作为字段添加到事件。您希望 Options 字段出现在第一个请求中,而在后续请求中丢失。当配置字段较少时效果更好,比如 "name."