在 Kafka 上实施事件溯源架构

Enforcing Event Sourcing schema on Kafka

需要说明的是,我并没有尝试将 Kafka 用作事件溯源的数据存储,而只是为了复制事件。

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

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

是否存在像 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" }
  ]
}

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

也就是说,最佳做法是不要对不同类型的数据使用相同的主题——例如,您通常不应将页面浏览事件和用户配置文件更新写入同一主题。

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

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

更具体的文档指针:

  • Register a new schema。要在同一主题下注册 new/multiple 模式,您只需通过相应的 API 调用注册它们。请注意,根据 Avro 兼容性设置,注册新模式(即当初始模式已注册到主题时)可能会失败,请参阅下一点。
  • Defining Avro compatibility settings for schemas(全局,或者对于为相同 subject/topic 注册的模式)。参见例如GET /config/(string: subject),其中 returns 主题的(Avro 架构)兼容性级别。

引用:

A schema should be compatible with the previously registered schemas (if there are any) as per the configured compatibility level. The configured compatibility level can be obtained by issuing a GET /config/(string: subject). If that returns null, then GET /config.

此外,valid (Avro schema) compatibility settings 是:NONE, FULL, FORWARD, BACKWARD。因此,如果您真的想在同一个 Kafka 主题中存储完全不同的数据类型,您应该 (a) 将相应 subject/topic 的 Avro 模式兼容性设置为 NONE 和 (b) 注册subject/topic.

下每种数据类型的相关 Avro 模式