在 Kafka 上实施事件溯源架构
Enforcing Event Sourcing schema on Kafka
需要说明的是,我并没有尝试将 Kafka 用作事件溯源的数据存储,而只是为了复制事件。
Kafka 的 Confluent Schema Registry 似乎非常有趣,因为它可以验证生产者发送到主题的消息的模式。但是,据我了解,它将每个主题视为一个容器文件——每个主题一个模式。
此限制不适用于事件源流,其中对于像 File
这样的单个聚合,您将有多个消息模式:FileCreated
、FileMoved
、FileCopied
, 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 实际上支持同一主题的多个模式。
也就是说,最佳做法是不要对不同类型的数据使用相同的主题——例如,您通常不应将页面浏览事件和用户配置文件更新写入同一主题。
为同一主题使用多个模式的一个常见示例是允许模式演变,例如从用户个人资料的基本模式开始(例如,仅用户名和年龄),随后将增强为更成熟的用户个人资料模式(用户名、年龄、地理区域、首选语言、上次访问日期、. ..).
是否要将 FileCreated
、FileMoved
、FileCopied
、FileDeleted
存储到同一主题由您决定。在任何一种情况下,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 模式
需要说明的是,我并没有尝试将 Kafka 用作事件溯源的数据存储,而只是为了复制事件。
Kafka 的 Confluent Schema Registry 似乎非常有趣,因为它可以验证生产者发送到主题的消息的模式。但是,据我了解,它将每个主题视为一个容器文件——每个主题一个模式。
此限制不适用于事件源流,其中对于像 File
这样的单个聚合,您将有多个消息模式:FileCreated
、FileMoved
、FileCopied
, 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 实际上支持同一主题的多个模式。
也就是说,最佳做法是不要对不同类型的数据使用相同的主题——例如,您通常不应将页面浏览事件和用户配置文件更新写入同一主题。
为同一主题使用多个模式的一个常见示例是允许模式演变,例如从用户个人资料的基本模式开始(例如,仅用户名和年龄),随后将增强为更成熟的用户个人资料模式(用户名、年龄、地理区域、首选语言、上次访问日期、. ..).
是否要将 FileCreated
、FileMoved
、FileCopied
、FileDeleted
存储到同一主题由您决定。在任何一种情况下,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, thenGET /config
.
此外,valid (Avro schema) compatibility settings 是:NONE, FULL, FORWARD, BACKWARD
。因此,如果您真的想在同一个 Kafka 主题中存储完全不同的数据类型,您应该 (a) 将相应 subject/topic 的 Avro 模式兼容性设置为 NONE
和 (b) 注册subject/topic.