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