2

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

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

此限制不适用于事件源流,其中对于像File您这样的单个聚合将具有多个消息模式:FileCreatedFileMovedFileCopiedFileDeleted。将这些中的每一个放在一个单独的主题上会很复杂并且容易出错。

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

更新

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

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

{ 
  type: "record",
  name: "FileDeleted",
  fields: [
    { name: "id", type: "string" },
    { name: "date", type: "long" },
    { name: "user", type: "string" }
  ]
}
4

1 回答 1

3

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

也就是说,最佳实践是不要对不同类型的数据使用相同的主题——也就是说,您通常不应该将页面查看事件和用户配置文件更新写入同一个主题。

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

是否要将FileCreated, FileMoved, FileCopied,存储FileDeleted到同一主题中取决于您。无论哪种情况,Confluent Schema Registry 都允许您管理相应的模式(请参阅文档)。

更具体的文档指针:

  • 注册一个新的架构。要在同一主题下注册新的/多个模式,您只需通过相应的 API 调用注册它们。请注意,根据 Avro 兼容性设置,注册新模式(即当初始模式已注册到主题时)可能会失败,请参阅下一点。
  • 为模式定义 Avro 兼容性设置(全局,或为同一主题/主题注册的模式)。请参见例如GET /config/(string: subject),它返回主题的(Avro 模式)兼容性级别。

报价:

根据配置的兼容性级别,模式应与先前注册的模式(如果有)兼容。配置的兼容级别可以通过发出GET /config/(string: subject). 如果返回 null,则GET /config.

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

于 2016-07-01T09:05:54.740 回答