Protobuf3:扩展类型支持
Protobuf3: extending type support
我的公司正在考虑使用 protobuf3 作为我们许多微服务之间的消息通信模式,我们正在努力寻找一种解决方案,以解决在处理在两个以上服务之间传输并具有多个版本的消息时丢失的信息,并且我会写一个例子来解释:
我有三个微服务 A、B、C,它们使用相同的架构相互通信:
message FooV1 {
int32 x = 1;
}
其中 A 向 B 发送消息,B 修改消息并将结果发送给 C(A->B->C)。
现在假设我更改架构并添加另一个字段:
message FooV2 {
int32 x = 1;
int32 y = 2;
}
然后,我仅使用新架构更新服务 A 和 C,而 B 将保留旧架构,如下所示:A:V2、B:V1、C:V2。
假设A发送x=1
和y=2
给B,B只知道标签1,所以根本不解析y。然后他通过更改 x
来改变它,例如,将其更改为 0。然后 B 将其发送给 C。C 现在得到 x
等于 0,但在此过程中 y
是 'vanished' 并且即使 A 和 C 都支持新模式,并且 B 不关心 y
,我们仍然会在此过程中丢失数据。
想让C知道y
还以为B不认识y
有什么方法可以告诉 protobuf 即使认为服务不会解析未知标签,他也不会删除数据,而是在发送时将其追加回消息中?如果有办法做到这一点,它是如何工作的?谢谢。
我在 google 的 protobuf3 文档中找到了这一段:
Originally, proto3 messages always discarded unknown fields during parsing, but in version 3.5 we reintroduced the preservation of unknown fields to match the proto2 behavior. In versions 3.5 and later, unknown fields are retained during parsing and included in the serialized output.
所以使用 protobuf3.5+ 是我的答案
我的公司正在考虑使用 protobuf3 作为我们许多微服务之间的消息通信模式,我们正在努力寻找一种解决方案,以解决在处理在两个以上服务之间传输并具有多个版本的消息时丢失的信息,并且我会写一个例子来解释:
我有三个微服务 A、B、C,它们使用相同的架构相互通信:
message FooV1 {
int32 x = 1;
}
其中 A 向 B 发送消息,B 修改消息并将结果发送给 C(A->B->C)。 现在假设我更改架构并添加另一个字段:
message FooV2 {
int32 x = 1;
int32 y = 2;
}
然后,我仅使用新架构更新服务 A 和 C,而 B 将保留旧架构,如下所示:A:V2、B:V1、C:V2。
假设A发送x=1
和y=2
给B,B只知道标签1,所以根本不解析y。然后他通过更改 x
来改变它,例如,将其更改为 0。然后 B 将其发送给 C。C 现在得到 x
等于 0,但在此过程中 y
是 'vanished' 并且即使 A 和 C 都支持新模式,并且 B 不关心 y
,我们仍然会在此过程中丢失数据。
想让C知道y
还以为B不认识y
有什么方法可以告诉 protobuf 即使认为服务不会解析未知标签,他也不会删除数据,而是在发送时将其追加回消息中?如果有办法做到这一点,它是如何工作的?谢谢。
我在 google 的 protobuf3 文档中找到了这一段:
Originally, proto3 messages always discarded unknown fields during parsing, but in version 3.5 we reintroduced the preservation of unknown fields to match the proto2 behavior. In versions 3.5 and later, unknown fields are retained during parsing and included in the serialized output.
所以使用 protobuf3.5+ 是我的答案