protobuf 编译器如何区分不同的服务及其具有相同 identifiers/tags 的消息?

How does the protobuff compiler distinguish between different services and their messages with same identifiers/tags?

问题是关于反序列化过程。我认为第一个字节描述了标签和相应的 on-wiretyp。但是,如果两个服务在其消息中使用相同的 tag/identifier 和数据类型怎么办?

Protobuf居然不区分这两者!考虑以下两条消息:

message Foo {
  int32 foo = 5; 
}

message Bar {
  int32 bar = 5; 
}

这两条消息看起来完全一样。原因是消息没有随附 schema。这使得消息更紧凑,处理起来更快,但有可能被误解的小缺点。

如果您使用的是 gRPC,消息可能看起来相同,但可以通过将它们发送到哪个服务来区分。例如:

service MyService {
  rpc EatTheFoo(Foo) returns (Bar); 
}
service YourService {
  rpc GoToTheBar(Bar) returns (foo);
}

即使这两个服务接受和接收看起来相同的消息,gRPC 也会在发送消息时包含服务和消息的名称。在引擎盖下,它将变成一个 HTTP/2 请求,看起来像:

POST /MyService/EatTheFoo HTTP/2

然后是 Foo 消息。如果有人不小心尝试发送 Bar 消息,服务器会发现方法名称错误并拒绝 RPC。因此,被误解的可能性很小。