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

时间:2015-05-11 20:10:13

标签: apache-kafka avro

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

Schema Registry API Reference的文档中,他们提到了“主题”的抽象。您在“主题”下注册了一个模式,其形式为 topicName-key ,或 topicName-value ,但没有解释您需要的原因(因为它)暗示一个单独的模式,用于给定主题上的消息的键和值。也没有任何直接的声明表明,注册“主题”必然会将模式与该主题相关联,而不是助记。

进一步令人困惑的事情,该页面上的后续示例(“获取主题的模式版本”和“在主题下注册新模式”)使用该主题名称的格式,而是使用只是“主题”值的主题名称。如果有人有任何见解a)为什么每个主题都有这两个“主题”,以及b)正确用法是什么,我们将不胜感激。

1 个答案:

答案 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的实施方式,而不是KafkaAvroSerializerKafkaAvroEncoder不以任何方式强制您为每个主题密钥\值使用一个模式,而KafkaAvroSerializer则执行。当您计划将多个Avro架构的数据生成到一个主题中时,这可能是一个问题。在这种情况下,KafkaAvroSerializer会尝试更新topic-keytopic-value主题,如果违反兼容性,99%将会中断(如果您有多个Avro架构,它们几乎总是不同且与之不兼容彼此)。

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

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

希望能帮到你