定义流的gRPC元数据的最佳实践



我必须向gRPC服务器发送消息流,但也必须发送大量关于该流的元数据。是否有一种方法可以定义元数据消息,并使其成为客户端和服务器之间接口合同的一部分?据我所知,将另一条消息封送至元数据似乎完全超出了.proto文件中的接口定义。

真的,我希望gRPC允许流式调用有两个参数,比如:

service DataServer {
rpc AddData(DataScope, stream MyData) returns (Reply) {}
}

有没有权利,或者至少有一种普遍接受的方式来处理这个问题?

不幸的是,这是不可能的。但这里有一个等价物:

您可以使用oneof关键字指定请求应包含配置(范围(或数据。您的客户端将很容易理解,AddDataRequest流中的第一个对象必须包含作用域,而以下对象必须包含数据。您的服务器实现必须断言这种行为。

service DataServer {
rpc AddData(stream AddDataRequest) returns (AddDataReply) {}
}
message AddDataRequest {
oneof request {
AddDataConfiguration configuration = 1;
Data data = 2;
}
}

我们决定嵌入一个可选的流定义"标题";MyData流消息中的消息。我们只在流的第一个MyData消息中填充该头消息。

message StreamBlock {
DataScope header = 1;
MyData    data   = 2;
}

当数据足够短,可以容纳在一个MyData protobuf消息中时,它允许我们在一个gRPC往返调用中发送标头和数据。当数据较长并被分解为多个MyData消息时,后续消息中未使用的头字段将不使用空间,因此没有额外的开销。

最新更新