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