Debezium 可能会产生无效的模式

Posted

技术标签:

【中文标题】Debezium 可能会产生无效的模式【英文标题】:Debezium might produce invalid schema 【发布时间】:2020-04-11 08:09:31 【问题描述】:

我遇到了 Avro 和 Schema Registry 的问题。在 Debezium 创建了模式和主题后,我从 Schema Registry 下载了模式。我把它放到一个 .asvc 文件中,它看起来像这样:

  
    "type": "record",
    "name": "Envelope",
    "namespace": "my.namespace",
    "fields": [
      
        "name": "before",
        "type": [
          "null",
          
            "type": "record",
            "name": "MyValue",
            "fields": [
              
                "name": "id",
                "type": "int"
              
            ]
          
        ],
        "default": null
      ,
      
        "name": "after",
        "type": [
          "null",
          "MyValue"
        ],
        "default": null
      
    ]
  

我做了两个实验:

    我尝试将其放回架构注册表,但出现此错误:MyValue 不正确。当我删除“之后”记录时,架构似乎运行良好。

    我使用 avro-maven-plugin 中的“generate-sources”来生成 Java 类。当我尝试使用上面的主题时,我看到了这个错误:

    线程“b2-StreamThread-1”org.apache.kafka.streams.errors.StreamsException 中的异常:在进程中捕获异常。 [...]:注册 Avro 架构时出错:[...]

    原因:io.confluent.kafka.schemaregistry.client.rest.exceptions.RestClientException:正在注册的模式与早期的模式不兼容;错误代码:409

有人遇到过同样的问题吗?是 Debezium 产生了无效的模式,还是 Schema Registry 出现了错误?

【问题讨论】:

【参考方案1】:

MyValue 不正确。

这不是 Avro 类型。您必须在联合中嵌入实际记录,就像之前的值一样

换句话说,您无法交叉引用架构中的记录类型,AFAIK

当我尝试使用上面的主题时,我看到了这个错误:

消费者不注册模式,因此不清楚你是如何得到这个错误的,除非可能使用 Kafka Streams,它会产生中间主题

【讨论】:

以上是关于Debezium 可能会产生无效的模式的主要内容,如果未能解决你的问题,请参考以下文章

Debezium 创建新主题时如何编辑复制因子

成功创建 Always On SQL Server 快照后,Debezium 未跟踪 CDC

从 Avro Debezium 数据创建基于 Avro 的 KSQL 流会生成奇怪的模式

Debezium 发件箱模式 |如果我们使用 debezium,架构是用 SMT/发件箱表固定的吗

使用 Debezium 将所有数据库表捕获到一个 Kafka 主题 [重复]

debezium - 模式注册表问题