Avro架构:向现有架构添加枚举值是否向后兼容



我在Avro模式中有一个状态枚举字段,其中当前可能的状态为

PENDING
APPROVED
REJECTED

我想在这个枚举"RESUBMIT"中再添加一个值。此更改是否向后兼容?

根据https://docs.confluent.io/platform/current/schema-registry/avro.html

  • BACKWARD兼容性意味着使用新模式的消费者可以读取使用上一个模式生成的数据
  • FORWARD兼容性意味着使用新模式生成的数据可以由消费者使用上一个模式读取

根据上面的定义/术语,更改为BACKWARD兼容,即您的所有消费者都需要首先升级。但是不兼容FORWARD,因为具有旧架构的使用者不能对其进行反序列化。

更正我之前的回答。

https://avro.apache.org/docs/current/idl.html#:~:text=一个%20Avro%20Enum%20支持%20可选,一个%20不兼容的%20符号%20是%20读取

有一种方法可以以兼容的方式添加新的枚举值

我不认为是这样,但欢迎您使用Schema Registry API来验证的兼容性

https://docs.confluent.io/current/schema-registry/develop/api.html#id1

不,不是。原因如下:如果您使用这个新模式来向Kafka发送事件,那么所有客户端都将尝试反序列化该值。当新类型的事件出现时,将有两种情况:

  1. 具有新架构的客户端将成功反序列化
  2. 具有架构的客户端将无法反序列化,因为它们的枚举中没有这样的值

所以,不,这是不向后兼容的。

更新:您可以通过为enum指定默认值来避免反序列化失败(在Avro 1.10.2+版本中可用(

最新更新