使用confluent platform,apache kafka的创建者提供的平台,我有一个问题:
在schemaregistryapi参考文档中,他们提到了“主题”的抽象。您在“主题”下注册了一个模式,其形式为topicname key或topicname value,但是没有解释为什么您需要(正如它所暗示的)一个单独的模式来表示给定主题上消息的键和值。也没有任何直接的说法表明,注册一个“主语”必然会将模式与该主题联系起来,而不是记忆。
更让人困惑的是,该页上的后续示例(“get schema version for subject”和“register new schema under subject”)并未将该格式用作主题名称,而是仅将主题名称用作“subject”值。如果有人对a)为什么每个主题都有这两个“主题”和b)正确用法有任何见解,我们将不胜感激。
1条答案
按热度按时间rfbsl7qr1#
合流模式注册表实际上与主题名称有点不一致:)
事实上
KafkaAvroSerializer
(用于新Kafka0.8.2生产商)用途topic-key|value
主题模式(链接)KafkaAvroEncoder
(对于老生产者)用途schema.getName()-value
模式(链接)。为什么每个主题有两个不同的主题(一个代表键,一个代表值),原因很简单:
假设我有一个表示日志项的avro模式,每个日志项都附带了一个源信息:
一个常见的用例是,我希望按源划分条目,因此希望有两个主题与topic关联(主题基本上是avro模式的修订版),一个是key(即
SourceInfo
)一个是有价值的(LogEntry
).拥有这两个主题将允许对数据进行分区和存储,只要我有一个运行的模式注册表,并且我的生产者/消费者可以与之交谈。对这些模式的任何修改都会反映在模式注册表中,只要它们满足兼容性设置,所有内容都应该序列化/反序列化,而不必关心这一点。
注:任何进一步的信息只是我个人的想法,也许我只是还没有完全理解这是怎么回事,所以我可能是错的。
我其实更喜欢
KafkaAvroEncoder
是实现的,而不是KafkaAvroSerializer
.KafkaAvroEncoder
不会以任何方式强制您对每个主题键\值使用一个架构KafkaAvroSerializer
做。当您计划在一个主题中生成多个avro模式的数据时,这可能是一个问题。在这种情况下KafkaAvroSerializer
会尝试更新topic-key
以及topic-value
如果兼容性被破坏(如果你有多个avro模式,它们几乎总是不同的,并且彼此不兼容),那么subjects和99%的subjects都会中断。在另一边,
KafkaAvroEncoder
只关心模式名称,您可以将多个avro模式的数据安全地生成到一个主题中,并且一切都应该正常工作(您将拥有与模式一样多的主题)。这种不一致性我仍然不清楚,我希望合流的人可以解释这一点,如果他们看到这个问题/答案。
希望对你有帮助