删除列时的 Kafka Connect Schema 演变

Kafka Connect Schema evolution when columns are removed

假设我们有如下设置。

架构演变兼容性设置为 BACKWARD。

JDBC Source Connector 从 DB 轮询数据写入 Kafka topic.HDFS Sink Connector 从 Kafka 主题读取消息并以 Avro 格式写入 HDFS。

按照我理解的流程进行。

  1. JDBC 源连接器查询数据库并从 JDBC ResultSet 的元数据生成架构 V1。V1 具有 col1,col2,col3.Schema V1 已在架构注册表中注册。
  2. 源连接器从 DB 轮询数据并将消息写入 V1 架构中的 Kafka 主题。
  3. (问题 1) 当 HDFS Sink 连接器从主题中读取消息时,它是否根据模式注册表中的 V1 模式验证消息?

下一个数据库架构已更改。 "col3" 列已从 table 中删除。

  1. 下次JDBC 源轮询 DB 发现模式已更改,生成新的模式 V2 (col1,col2) 并将 V2 注册为模式注册表。
  2. Source Connect 继续轮询数据并写入 V2 架构中的 Kafka 主题。
  3. 现在 Kafka 主题可以在 V1 和 V2 架构中包含消息。
  4. (问题 2)当 HDFS Sink 连接器读取消息时,它现在是否根据 Schema V2 验证消息?

Confluent 文档在向后兼容性下解决了这个问题? : [https://docs.confluent.io/current/schema-registry/avro.html#schema-evolution-and-compatibility]

An example of a backward compatible change is a removal of a field. A consumer that was developed to process events without this field will be able to process events written with the old schema and contain the field – the consumer will just ignore that field.

注册表仅在注册新模式时验证。

因此,if/when 源连接器检测到更改,然后在注册表端进行验证

至于 HDFS 连接器,有一个单独的 schema.compatibility 属性 可以对内存中保存的记录和任何新记录应用投影。当您获得具有新模式的记录并进行向后兼容更新时,所有尚未刷新的消息都将更新以在写入 Avro 容器文件时保留新模式。

旁白:仅仅因为注册表认为它是倒退的,并不能保证接收器连接器确实...源代码中的验证是不同的,我们遇到了多个问题:/