apache-kafka - 汇合平台 : Schema Registry Subjects

标签 apache-kafka avro

与 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-keytopic-value如果违反兼容性,则 99% 会中断(如果您有多个 Avro 模式,它们几乎总是不同且彼此不兼容)。

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

这种不一致对我来说仍然不清楚,我希望 Confluent 的人如果看到这个问题/答案,可以解释一下。

希望能帮到你

关于apache-kafka - 汇合平台 : Schema Registry Subjects,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30176764/

相关文章:

java - 如何在 Java 中使用 AVRO 序列化日期

avro - 空列表作为AVRO数组中的默认值

java - 为什么静态类型语言需要 Avro 架构注册表?

apache-kafka - Kafka 多个生产者写入同一主题 - 消息和数据突发的排序

hadoop - 使用 kafka-connect 的多个配置单元分区

java - Spring Boot从Java启动Zookeeper和Kafka Server

python - 如何在 JSON avro 模式中创建枚举数组?

hadoop - 代码生成在 avro - hadoop 中意味着什么

apache-kafka - 如何检查哪个zookeeper实例是集成中的领导者

multithreading - 使用来自多个 kafka 主题的消息的最佳实践是什么?