如何解决添加新字段时的模式演变
想象一下有独立的应用程序:生产者和消费者。
生产者代码:
import os
from confluent_kafka import avro
from confluent_kafka.avro import AvroProducer
avsc_dir = os.path.dirname(os.path.realpath(__file__))
value_schema = avro.load(os.path.join(avsc_dir,"basic_schema.avsc"))
config = {'bootstrap.servers': 'localhost:9092','schema.registry.url': 'http://0.0.0.0:8081'}
producer = AvroProducer(config=config,default_value_schema=value_schema)
producer.produce(topic='testavro',value={'first_name': 'Andrey','last_name': 'Volkonsky'})
basic_schema.avsc 文件位于生产者应用中。其内容:
{
"name": "basic","type": "record","doc": "basic schema for tests","namespace": "python.test.basic","fields": [
{
"name": "first_name","doc": "first name","type": "string"
},{
"name": "last_name","doc": "last name","type": "string"
}
]
}
现在,消费者内部是什么并不重要。
我们运行了一次生产者,一切正常。然后我想添加 age 字段:
basic_schema.avsc:
{
"name": "basic",{
"name": "age","doc": "age","type": "int"
}
]
}
这里出现错误:
confluent_kafka.avro.error.ClientError:不兼容的 Avro 架构:409
他们在这里说 https://docs.confluent.io/platform/current/schema-registry/avro.html#summary 对于兼容性类型 == BACKWARD 消费者应该首先更新。
技术上我无法理解。我的意思是我是否必须将 basic_schema.avsc 文件复制到消费者 并运行它?
解决方法
如果您使用 BACKWARDS 兼容性(默认)注册架构,融合架构注册表将不允许您进行不兼容的更改 - 添加必填字段。
您可以添加可选字段或使用向前兼容性
无论兼容性规则实际上允许您进行什么更改,关于应该首先升级什么的规则都是正确的。
编辑 - 附加信息
- 不要仅仅因为您可能需要添加必填字段而使用前向兼容性。根据谁可以首先更新,使用对您的案例有意义的兼容性可能无法让所有生产者同时升级。
- 因此,如果使用向后兼容性并且需要添加必填字段,您可能需要新版本的服务,例如topic.v1 和 topic.v2,其中服务的 v2 使用具有新的必填字段的架构,您可以弃用 v1 服务...例如
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。