【问题标题】:Enforcing Event Sourcing schema on Kafka在 Kafka 上执行事件溯源模式
【发布时间】:2016-06-28 23:37:20
【问题描述】:

需要明确的是,我并不是想将 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" }
  ]
}

【问题讨论】:

  • 同样的问题,有没有办法在 json 中为 avro 模式指定“oneOf”?

标签: apache-kafka avro confluent-platform


【解决方案1】:

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 模式( s) 针对该主题/主题下的每种数据类型。

【讨论】:

  • 您能否提供更具体的链接,指向文档中支持此功能的位置?只需阅读Quickstart,第 7 步演示了如何拒绝与第一个不兼容的第二个模式。是否有特定的 API 或配置设置允许为同一主题注册多个模式?
  • @MarkJMiller:编辑了我的答案。希望这会有所帮助。
  • 感谢您的澄清。如果 Schema Registry 允许在事件溯源场景中强制执行模式,那就太好了 - 特别是因为这是 Kafka 文档调用的specific use case。在这些情况下,强制执行版本兼容性的能力会很好。
  • 在事件溯源的情况下,是否考虑详细说明模式版本兼容性及其执行方式与模式注册表在这方面已经提供的不同?
  • 事件溯源使用异构消息的有序日志(如我上面的示例)。如果您按消息类型拆分该日志以启用BACKWARD 兼容性,您将失去顺序。如果要保持顺序,则需要将主题的兼容性设置为NONE。我只想将主题限制为配置的架构列表,但我还想确保架构的新版本是向后兼容的。
猜你喜欢
  • 2018-08-31
  • 2016-06-02
  • 1970-01-01
  • 2016-06-16
  • 2022-08-19
  • 2018-10-03
  • 2019-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多