这是一个消耗事件流的服务的原型定义 来自客户
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变得有点笨拙。
是否有更简洁的方法可以达到相同的效果?
答案 0 :(得分:4)
当许多字段或消息在播放时,使用oneof
是建议的方法。开销很小,因此通常不会引起关注。虽然有笨拙。
如果只有几个字段,您可能希望将Options和Event中的字段合并为一条消息。或者类似地将“事件”选项添加到字段中。您希望选项字段出现在第一个请求中,而后续丢失。当配置字段较少时,这种方法效果会更好,例如“名称”。