汇合平台:架构注册表主题

Tic*_*ick 9 avro apache-kafka

使用Apache Kafka创建者提供的Confluent Platform平台,我有一个问题:

Schema Registry API Reference的文档中,他们提到了"Subject"的抽象.您在"subject"下注册了一个模式,其主题为topicName-keytopicName-value,但是没有解释为什么需要(因为它暗示)一个单独的模式来表示消息的键和值.给定主题.也没有任何直接的声明,即注册"主题"必然将模式与该主题相关联,而不是助记.

进一步令人困惑的是,该页面上的后续示例("获取主题的模式版本"和"在主题下注册新模式")使用该主题名称的格式,而是仅使用主题名称作为"主题"值.如果有人对a)为什么每个主题有这两个"主题",以及b)正确用法是什么有任何见解,那将非常感激.

ser*_*jja 9

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-keytopic-value主题,如果违反兼容性,99%会破坏(如果你有多个Avro架构,它们几乎总是不同并且彼此不兼容).

另一方面,KafkaAvroEncoder只关心模式名称,您可以安全地将多个Avro模式的数据生成一个主题,一切都应该正常工作(您将拥有与模式一样多的主题).

这种不一致对我来说仍然不清楚,我希望Confluent的人能够解释这个问题,如果他们看到这个问题/答案.

希望对你有所帮助

  • 所以,安东尼奥。您建议如何维护模式演变、多种类型的事件和顺序? (2认同)