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 消息,它 可以包含 OptionsEvent 消息。

message PublishMessage {
  oneof content {
    Options options = 1;
    Event event = 2;
  }
}

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

是否有更简洁的方法来达到相同的结果?

当有许多字段或消息在播放时,建议使用 oneof 方法。开销很小,所以通常不会是一个问题。不过还是有点笨拙。

如果只有几个字段,您可能希望将选项和事件中的字段合并到一条消息中。或者类似地将选项作为字段添加到事件。您希望 Options 字段出现在第一个请求中,而在后续请求中丢失。当配置字段较少时效果更好,比如 "name."