汇合平台:模式注册表主题

qrjkbowd  于 2021-06-08  发布在  Kafka
关注(0)|答案(1)|浏览(346)

使用confluent platform,apache kafka的创建者提供的平台,我有一个问题:
在schemaregistryapi参考文档中,他们提到了“主题”的抽象。您在“主题”下注册了一个模式,其形式为topicname key或topicname value,但是没有解释为什么您需要(正如它所暗示的)一个单独的模式来表示给定主题上消息的键和值。也没有任何直接的说法表明,注册一个“主语”必然会将模式与该主题联系起来,而不是记忆。
更让人困惑的是,该页上的后续示例(“get schema version for subject”和“register new schema under subject”)并未将该格式用作主题名称,而是仅将主题名称用作“subject”值。如果有人对a)为什么每个主题都有这两个“主题”和b)正确用法有任何见解,我们将不胜感激。

rfbsl7qr

rfbsl7qr1#

合流模式注册表实际上与主题名称有点不一致:)
事实上 KafkaAvroSerializer (用于新Kafka0.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"
               }
            ]
         }
      }
   ]
}

一个常见的用例是,我希望按源划分条目,因此希望有两个主题与topic关联(主题基本上是avro模式的修订版),一个是key(即 SourceInfo )一个是有价值的( LogEntry ).
拥有这两个主题将允许对数据进行分区和存储,只要我有一个运行的模式注册表,并且我的生产者/消费者可以与之交谈。对这些模式的任何修改都会反映在模式注册表中,只要它们满足兼容性设置,所有内容都应该序列化/反序列化,而不必关心这一点。
注:任何进一步的信息只是我个人的想法,也许我只是还没有完全理解这是怎么回事,所以我可能是错的。
我其实更喜欢 KafkaAvroEncoder 是实现的,而不是 KafkaAvroSerializer . KafkaAvroEncoder 不会以任何方式强制您对每个主题键\值使用一个架构 KafkaAvroSerializer 做。当您计划在一个主题中生成多个avro模式的数据时,这可能是一个问题。在这种情况下 KafkaAvroSerializer 会尝试更新 topic-key 以及 topic-value 如果兼容性被破坏(如果你有多个avro模式,它们几乎总是不同的,并且彼此不兼容),那么subjects和99%的subjects都会中断。
在另一边, KafkaAvroEncoder 只关心模式名称,您可以将多个avro模式的数据安全地生成到一个主题中,并且一切都应该正常工作(您将拥有与模式一样多的主题)。
这种不一致性我仍然不清楚,我希望合流的人可以解释这一点,如果他们看到这个问题/答案。
希望对你有帮助

相关问题