Kafka生产者序列化记录时如何查找对应的Schema ID?
Kafka Producer 无需手动指定 Schema ID 的实现逻辑
你提到的这个特性是 KafkaAvroSerializer 内置的能力,整个查找/匹配 Schema 的流程完全由序列化器自动完成,具体逻辑如下:
- 自动提取本地 Schema
你代码中用到的Employee是 Avro 插件根据.avscSchema 定义自动生成的类,本身自带getSchema()方法。当 Producer 发送Employee类型的消息时,KafkaAvroSerializer会先调用待序列化对象的该方法,拿到对应的 Avro Schema 实例。 - 定位对应 Subject 分组
Schema Registry 中的所有 Schema 都是按Subject分组管理的,默认使用TopicNameStrategy命名策略:
- 消息 Key 对应的 Subject 命名为
<Topic名称>-key - 消息 Value 对应的 Subject 命名为
<Topic名称>-value
你示例中发送的是new-employees主题的 Value 数据,对应的 Subject 就是new-employees-value。
- Schema 匹配与注册
序列化器会把提取到的本地 Schema,向配置的 Schema Registry 发起查询,在对应 Subject 下查找完全匹配的 Schema:
- 如果该 Schema 已经在 Subject 下存在,直接返回对应的 Schema ID
- 如果该 Schema 不存在,会先根据 Subject 配置的兼容性规则做校验,校验通过后自动注册该 Schema,返回新生成的 Schema ID
- 写入序列化结果
拿到 Schema ID 后,序列化器会按照固定格式生成最终的二进制消息:开头写入1字节的魔数(固定为0),之后写入4字节的 Schema ID,最后拼接 Avro 序列化后的业务数据。消费者侧的反序列化器就可以读取消息头中的 Schema ID,去 Schema Registry 拉取对应 Schema 完成反序列化。
默认配置下 Schema 自动注册是开启的,你也可以通过配置 auto.register.schemas=false 关闭该能力,此时如果本地 Schema 未提前注册到 Schema Registry,序列化会直接抛出异常。
内容的提问来源于stack exchange,提问作者jeff
相关产品推荐
相关产品推荐

