0

想象有分开的应用程序:生产者和消费者。

生产者代码:

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"
        }
    ]
}

目前,消费者内部的内容并不重要。

我们运行生产者一次,一切正常。然后我想添加年龄字段:

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"
        },
        {
             "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文件复制到消费者并运行它吗?

4

1 回答 1

1

如果您注册了具有 BACKWARDS 兼容性(默认)的模式,则融合模式注册表根本不允许您进行不兼容的更改 - 添加必填字段。

您可以添加可选字段或使用前向兼容性

无论兼容性规则实际上允许您进行哪些更改,关于应该首先升级什么的规则都是正确的。

编辑 - 附加信息

  • 不要仅仅因为您可能需要添加必填字段而使用前向兼容性。根据谁可以先更新,使用对您的情况有意义的兼容性,例如,可能无法让所有生产者同时升级。
  • 因此,如果使用向后兼容性并需要添加必填字段,您可能需要新版本的服务,例如 topic.v1 和 topic.v2,其中 v2 服务使用具有新必填字段的架构,您可以弃用 v1 服务。 ..例如
于 2021-03-31T08:16:58.863 回答