stream - gRPC 流服务只能有一个参数的原因

标签 stream protocol-buffers grpc

目前,gRPC 服务定义只能有一个参数,即使它是一个流服务,这使得表示“初始”请求具有挑战性。例如,考虑一个用户可以加入聊天室的聊天应用程序。

在这种情况下,域可以建模如下。

message JoinRoomRequest {
  required string room = 1;
}

message ChatMessage {
  required string content = 2;
}

聊天应用程序的消费者将发送加入请求并启动双向消息流,因此可以用这种方式描述服务。

service SimpleChat {
  rpc joinChatRoom (JoinRoomRequest, stream ChatMessage) returns (stream ChatMessage);
}

但是,在 gRPC 中,上述语法无效。表示所描述的聊天服务的唯一方法是

service SimpleChat {
  rpc joinChatRoom (stream ChatMessage) returns (stream ChatMessage);
}

这个决定背后的原因是什么,以及如何在 gRPC 中建模类似的域?

最佳答案

简单。将请求/响应建模为单个有效负载而不是可变参数要容易得多,尤其是在您希望多重性不同的情况下 - 例如,这意味着什么

(A, stream B, C, stream D)

而且......如果你可以获取多个元素,你也可以返回多个元素吗?毕竟,许多语言都支持这个概念。

不,接收(作为输入或输出)请求或单一类型的请求流要容易得多。

在您的场景中,也许可以将请求类型视为所有实际预期消息的 oneof (区分联合)的事物包装器,并且只需让您的代码强制第一个是“加入”:

message ChatRequest {
  oneof RequestType {
    JoinRoomRequest join = 1;
    ChatMessage message = 2;
  }
}

并取一个 ChatRequest

关于stream - gRPC 流服务只能有一个参数的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57238638/

相关文章:

c# - 异步Telnet服务器数据接收问题

mongodb - 从 bson 结构转换 protoc 生成的结构的最佳方法是什么?

c# - 如何为 gRPC 启用服务器端 SSL?

service - Grpc 服务器在作为 Windows 服务运行时不监听端口 5001

java - BufferedReader java.io.IOException : stream is closed

android - 从电吉他到 Android 设备的音频流

c# - 如何使用WPF MediaKit播放YouTube视频?

c++ - 为什么我的字符串流是空的?

protocol-buffers - Avro 尺寸太大?

protocol-buffers - protobuf-net 与 protobuf-csharp-port 的性能对比