如果我们在Kafka中使用模式注册表,那么每次生产者每次将记录发送给经纪人时都需要发送当前版本的Kafka吗?
如果是,这个额外开销是什么意思,因为我们已经在每个avro文件中发送模式了?
如果不是,请对我的问题感到遗憾,请帮助我更好地理解架构注册表。
答案 0 :(得分:0)
每个生产者每次将记录发送给经纪人时都需要发送当前版本的Kafka
假设您的意思是Avro Schema的版本,则否,串行器和注册表在后台处理该版本。模式本身会转换为JSON,然后发布到注册表中,在此处进行哈希处理,存储,然后返回增量ID。
在序列化程序获得此ID之后,Avro消息的剩余字节数组将发送到Kafka。
使用者反序列化器必须读取此ID,查找注册表,然后使用注册表返回的架构读取Avro字节。您可以通过将模式与使用者一起存储来覆盖此行为(类似于对Protobuf或JSON的处理方式)
此额外开销的含义是什么,因为我们已经在每个avro文件中发送了架构?
Confluent序列化程序不会不包括Kafka消息中的架构,对于注册表中的任何给定ID,只能在GET /schemas/ids/:id
上找到一个4位整数ID
使用注册表有很大的不同
这是一个充满问题的问题;)与发送随机值字符串到主题相比,我认为是这样。默认情况下,注册表会强制使用新使用者通过兼容性检查来读取主题中的所有架构。
如果您使用JSON或字符串,那么有人可以发送{"hello" : "world"}
,然后发送数字2
,如果您的消费者期望使用JSON对象,则会立即中断