【问题标题】:Protobuf3: extending type supportProtobuf3:扩展类型支持
【发布时间】:2020-11-12 16:32:38
【问题描述】:

我的公司正在考虑使用 protobuf3 作为我们许多微服务之间的消息通信架构,我们在处理在超过 2 个服务之间传输并且具有多个版本的消息时努力寻找信息丢失的解决方案,而我'写个例子来说明:

我有三个微服务,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=1y=2给B。B只知道标签1,所以他根本不解析y。然后他改变x,例如将其更改为0。然后B将其发送给C。C现在得到等于0的x,但在此过程中y“消失”了,即使A和 C 都支持新的 schema,B 不关心y,我们在这个过程中仍然会丢失数据。

我想让 C 知道 y 即使 B 不认识 y 有什么方法可以告诉 protobuf,即使该服务不会解析未知标签,他也不会删除数据,而是在发送时将其附加到消息中?如果有办法做到这一点,它是如何工作的?谢谢。

【问题讨论】:

  • 这是库和平台特定的。一些实现保留了意想不到的字段 - 例如,可以肯定 Google 版本在大多数平台上都是如此。那么:您打算使用哪些平台和库?另请注意:“proto3”没有“必需”的概念 - 仅在“proto2”中
  • @Marc Gravell 实际上在你这么说之后我检查了谷歌 protobuf 并看到从 3.5 版及更高版本开始它默认具有此功能,所以它实际上回答了我的问题(我不小心阅读了版本 2 的文档)

标签: microservices protocol-buffers


【解决方案1】:

我在 google 的 protobuf3 文档中找到了这一段:

最初,proto3 消息在解析过程中总是丢弃未知字段,但在 3.5 版本中,我们重新引入了保留未知字段以匹配 proto2 行为。在 3.5 及更高版本中,未知字段会在解析过程中保留并包含在序列化输出中。

所以使用 protobuf3.5+ 是我的答案

【讨论】:

    猜你喜欢
    • 2019-05-29
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-30
    • 1970-01-01
    • 2012-01-22
    相关资源
    最近更新 更多