GRPC:带有配置消息的客户端流

Ili*_*oly 5 protocol-buffers grpc

这是使用来自客户端的事件流的服务的原型定义

message Event {
  // ...
}

service EventService {
  rpc Publisher(stream Event) returns (google.protobuf.Empty);
}
Run Code Online (Sandbox Code Playgroud)

问题是需要告诉服务器如何处理这个流。理想情况下,它会首先收到一条Options消息:

message Event {
  // ...
}

message Options {
  // ...
}

service EventService {
  rpc Publisher(Options, stream Event) returns (google.protobuf.Empty);
}
Run Code Online (Sandbox Code Playgroud)

但是,grpc 只支持rpc方法的一个参数。一种解决方案是引入一个额外的PublishMessage消息,它可以包含一个OptionsEvent消息。

message PublishMessage {
  oneof content {
    Options options = 1;
    Event event = 2;
  }
}
Run Code Online (Sandbox Code Playgroud)

然后服务会期望第一个PublishMessage包含Options消息,所有后续的包含Event消息。这会从包装消息中引入额外的开销,并使 api 有点笨拙。

有没有更干净的方法来实现相同的结果?

Eri*_*son 5

oneof当有许多字段或消息在起作用时,建议使用使用方法。开销很小,因此通常不会成为问题。不过也有笨拙之处。

如果只有几个字段,您可能希望将 Options 和 Event 中的字段组合成一条消息。或者类似地将选项添加到事件作为字段。您希望 Options 字段出现在第一个请求中,而在后续请求中丢失。当配置字段较少时,这会更有效,例如只有“名称”。