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。因此,被误解的可能性很小。
问题是关于反序列化过程。我认为第一个字节描述了标签和相应的 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。因此,被误解的可能性很小。