当前位置: 首页 > 知识库问答 >
问题:

Avro联盟:向前兼容性?

宗政永望
2023-03-14

我们的系统由多个微服务组成,这些微服务发出并使用以avro格式编码的事件(参见底部的模式)。一个特定的用例如下:服务A在主题T1上发出一个事件(类型为InvoiceEvents),服务B和C(不同的开发团队)在T1上消费。例如,服务B是税务团队的一部分,而服务C是产品履行团队的一部分。

我本以为以下是真的(但似乎不是真的):

  1. 通过添加新的联合类型(即为字段“payload”创建的InvoiceCreated),模式可以从版本1(v1)发展到版本2(v2)——查看底部的示例模式

但服务C无法反序列化InvoiceCreated类型的新事件。具体来说,就是投掷:

org.apache.avro.AvroTypeException: Found com.elsevier.q2c.schema.avro.invoice.InvoiceCreated, expecting unionorg.apache.avro.AvroTypeException: Found com.elsevier.q2c.schema.avro.invoice.InvoiceCreated, expecting union at org.apache.avro.io.ResolvingDecoder.doAction(ResolvingDecoder.java:292) at 

avro接头类型是否不向前兼容(如上所述)?它们是否仅如合流模式注册表测试所暗示的那样向后兼容。避免微服务耦合的建议方法是什么?我猜不能使用avro工会。。

谢谢

没有明确答案的相关链接:Avro union兼容性模式增强建议

架构v1:

[
   ...
   {
      "type":"record",
      "name":"InvoiceEvents",
      "namespace":"bla.bla.schema.avro.invoice",
      "fields":[
         {
            "name":"payload",
            "type":[
               "null",
               "bla.bla.schema.avro.invoice.InvoiceDrafted"
            ],
            "default":null
         }
      ]
   }
]

模式v2(添加了新的联合类型:InvoiceCreated):

[
   ...
   {
      "type":"record",
      "name":"InvoiceEvents",
      "namespace":"bla.bla.schema.avro.invoice",
      "fields":[
         {
            "name":"payload",
            "type":[
               "null",
               "bla.bla.schema.avro.invoice.InvoiceDrafted",
               "bla.bla.schema.avro.invoice.InvoiceCreated",
            ],
            "default":null
         }
      ]
   }
]

共有1个答案

宦高岑
2023-03-14

经过一番思考后,我们可能会选择选项3,因为不跳过/丢失事件对项目来说比解耦更重要:

  1. 处理自定义derserialiser中的异常并跳过事件(可能会丢失感兴趣的事件-为了不丢失事件,必须先升级所有消费服务,然后再升级所有生产服务)

请评论是否有更好的选择,我错过了!

更新:似乎选项(2)现在可以以更简洁的方式实现,因为现在你可以有多种类型的主题(https://github.com/confluentinc/schema-registry/pull/680)。这意味着一个主题可以有不同的值类型(例如InvoiceCreated、InvoiceEdited等)不使用avro联合,而每种不同的类型都会有自己的进化路线!

 类似资料:
  • 我有一个avro模式定义,比如- 上线后,我们增加了另一个领域- CusterType被定义为null, string。即使在向合流注册表注册架构时,我们也会收到错误-正在注册的架构与早期架构不兼容。 如果有什么原因,请告诉我们。我们通过显式地将customerType默认为null来解决这个问题, Union{null, string}CusterType=null; 但不知何故,我觉得这不是必

  • 我有两个Avro模式V1和V2,在spark中读取如下: V1有两个字段“一”和“二” V2 与新字段:“三” 场景:编写器使用 V1 进行写入,读取器使用 V2 对 avro 记录进行解码。我的期望是看到字段3填充了默认值,即null。但是我在spark工作中遇到了以下异常。 我是不是错过了什么?我的理解是avro支持向后兼容。

  • ngrok承诺有关其接口的兼容性和稳定性,以便您可以自信地构建集成顶部,知道在升级到较新版本时期望的更改。 兼容性承诺 Point Release (2.0.0 -> 2.0.1) - ngrok承诺在点发布之间没有突破性的变化 Minor Version Change (2.0 -> 2.1) - ngrok可能会进行小的更改,打破兼容性的次要版本更改。 ngrok承诺,任何破坏性更改将由一个版

  • Google正在弃用Google Cloud消息传递,转而采用Firebase Cloud消息传递: Firebase云消息传递(FCM)是GCM的新版本。它继承了可靠和可扩展的GCM架构体系,加上新功能!查看常见问题解答了解更多信息。如果要在新应用中集成消息,请从FCM开始。强烈建议GCM用户升级到FCM,以便在今天和将来受益于新的FCM功能。 根据我在服务器上进行的一些测试,FCM URL(h

  • 使用汇流5.4.1 在将连接的流从连接的KTable转发到另一个主题时,我们碰巧在新的KTable外键连接中遇到了一个问题。 将错误中提到的模式与在模式注册表上注册的模式进行比较,结果完全相同…似乎Kafka 2.4.0中已经出现了类似的问题:https://issues.apache.org/jira/browse/Kafka-9390并且该问题在转发到另一个主题时仍然存在

  • 问题内容: 我在一个应用程序中工作,我们需要将对象保存为XML格式,并在以后需要时加载它们。为此,我使用JAXB将XML编组和解编回Java类。 我的问题是我必须在某个时候更改Java模型(通过添加,重命名或删除属性),结果,我将拥有不兼容的保存XML,无法将其绑定回新的类形式。 为了解决这个问题,每次必须进行更改时,我都会在一个新程序包(以其版本命名)下复制所有类的副本,并应用所请求的更改。并且