在Kafka上实施事件采购架构

时间:2016-06-28 23:37:21

标签: apache-kafka avro confluent

要明确的是,我并不是想将Kafka用作事件采购的数据存储,而只是为了复制事件。

Kafka的Confluent Schema Registry似乎非常有趣,因为它可以验证生产者发送给主题的消息的模式。但是,根据我的理解,它将每个主题视为容器文件 - 每个主题一个模式。

此限制不适用于事件源流,对于像File这样的单个聚合,您将拥有多个消息架构:FileCreatedFileMoved,{{1} },FileCopied。将每个这些都放在一个单独的主题上会很复杂且容易出错。

是否存在Schema Registry这样的工具,它支持同一主题的多个模式?

更新

为了澄清,上面的每条消息都有不同的架构。例如:

FileDeleted

FileCreated

{ type: "record", name: "FileCreated", fields: [ { name: "id", type: "string" }, { name: "name", type: "string" }, { name: "path", type: "string" }, { name: "size", type: "string" }, { name: "mimeType", type": "string" }, { name: "user", type: "string" }, { name: "date", type: "long" } ] }

FileMoved

{ type: "record", name: "FileMoved", fields: [ { name: "id", type: "string" }, { name: "from", type: "string" }, { name: "to", type: "string" }, { name: "date", type: "long" }, { naem: "user", type: "string" } ] }

FileDeleted

1 个答案:

答案 0 :(得分:3)

Confluent Schema Registry确实支持同一主题的多个模式。

尽管如此,最佳做法是不对不同类型的数据使用相同的主题 - 例如,您通常不应将页面视图事件和用户配置文件更新写入同一主题。

对同一主题使用多个模式的一个常见示例是允许模式演变,例如,从用户配置文件的基本架构开始(例如只是用户名和年龄),随后将增强为用户配置文件的更完整的架构(用户名,年龄,地理区域,首选语言,上次访问日期,。 ..)。

您是否要将FileCreatedFileMovedFileCopiedFileDeleted存储到同一主题中取决于您。在任何一种情况下,Confluent Schema Registry都允许您管理相应的模式(see docs)。

更具体的文档指针:

  • Register a new schema。要在同一主题下注册新的/多个模式,您只需要通过相应的API调用注册它们。请注意,注册新架构(即初始架构已经向主体注册)可能会失败,具体取决于Avro兼容性设置,请参阅下一点。
  • Defining Avro compatibility settings for schemas(全局或针对同一主题/主题注册的模式)。参见例如GET /config/(string: subject),返回主题的(Avro架构)兼容级别。

引用:

  

架构应该与配置的兼容级别兼容以前注册的架构(如果有的话)。可以通过发出GET /config/(string: subject)来获取配置的兼容级别。如果返回null,则GET /config

此外,valid (Avro schema) compatibility settings还是:NONE, FULL, FORWARD, BACKWARD。因此,如果你真的想在同一个Kafka主题中存储完全不同的数据类型,你应该(a)将相应主题/主题的Avro架构兼容性设置为NONE,以及(b)注册相关的Avro该主题/主题下每种数据类型的模式。