微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

添加新字段时的模式演变

如何解决添加新字段时的模式演变

想象一下有独立的应用程序:生产者和消费者。

生产者代码

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 举报,一经查实,本站将立刻删除。