使用Apache Kafka创建者提供的Confluent Platform平台,我有一个问题:
在Schema Registry API Reference的文档中,他们提到了“主题”的抽象。您在“主题”下注册了一个模式,其形式为 topicName-key ,或 topicName-value ,但没有解释您需要的原因(因为它)暗示一个单独的模式,用于给定主题上的消息的键和值。也没有任何直接的声明表明,注册“主题”必然会将模式与该主题相关联,而不是助记。
进一步令人困惑的事情,该页面上的后续示例(“获取主题的模式版本”和“在主题下注册新模式”)不使用该主题名称的格式,而是使用只是“主题”值的主题名称。如果有人有任何见解a)为什么每个主题都有这两个“主题”,以及b)正确用法是什么,我们将不胜感激。
答案 0 :(得分:9)
Confluent Schema Registry实际上与主题名称有点不一致:)
实际上,KafkaAvroSerializer
(用于新的Kafka 0.8.2制作人)对主题(link)使用topic-key|value
模式,而KafkaAvroEncoder
(对于旧制作者)使用schema.getName()-value
{1}}模式(link)。
每个主题有两个不同主题(一个用于键,一个用于值)的原因非常简单:
说我有一个表示日志条目的Avro架构,每个日志条目都附有一个源信息:
{
"type":"record",
"name":"LogEntry",
"fields":[
{
"name":"line",
"type":"string"
},
{
"name":"source",
"type":{
"type":"record",
"name":"SourceInfo",
"fields":[
{
"name":"host",
"type":"string"
},
{
"name":"...",
"type":"string"
}
]
}
}
]
}
一个常见的用例是我想按源分区条目,因此希望有两个主题与主题相关联(主题基本上是Avro模式的修订) - 一个用于密钥(SourceInfo
)和一个值(LogEntry
)。
拥有这两个主题将允许分区和存储数据,只要我有一个模式注册表运行,我的生产者/消费者可以与之交谈。对这些模式的任何修改都将反映在模式注册表中,只要它们满足兼容性设置,一切都应该只是序列化/反序列化而不必关心它。
注意:任何进一步的信息只是我的个人想法,也许我还没有完全理解这应该如何工作所以我可能错了。< / p>
我实际上更喜欢KafkaAvroEncoder
的实施方式,而不是KafkaAvroSerializer
。 KafkaAvroEncoder
不以任何方式强制您为每个主题密钥\值使用一个模式,而KafkaAvroSerializer
则执行。当您计划将多个Avro架构的数据生成到一个主题中时,这可能是一个问题。在这种情况下,KafkaAvroSerializer
会尝试更新topic-key
和topic-value
主题,如果违反兼容性,99%将会中断(如果您有多个Avro架构,它们几乎总是不同且与之不兼容彼此)。
另一方面,KafkaAvroEncoder
只关心模式名称,您可以安全地将多个Avro模式的数据生成一个主题,一切都应该正常工作(您将拥有与模式一样多的主题)。
这种不一致对我来说仍然不清楚,我希望Confluent人能够解释这个问题,如果他们看到这个问题/答案。
希望能帮到你