Apache kafka 在Kafka上实施事件源模式
明确地说,我并不是试图使用卡夫卡作为事件来源的数据存储,只是为了复制事件 对于Kafka来说,它似乎非常有趣,因为它可以验证生产者发送到主题的消息的模式。然而,据我所知,它将每个主题视为一个容器文件——每个主题一个模式 此限制不适用于事件源流,其中对于单个聚合(如Apache kafka 在Kafka上实施事件源模式,apache-kafka,avro,confluent-platform,Apache Kafka,Avro,Confluent Platform,明确地说,我并不是试图使用卡夫卡作为事件来源的数据存储,只是为了复制事件 对于Kafka来说,它似乎非常有趣,因为它可以验证生产者发送到主题的消息的模式。然而,据我所知,它将每个主题视为一个容器文件——每个主题一个模式 此限制不适用于事件源流,其中对于单个聚合(如文件),您将有多个消息架构:文件创建,文件移动,文件复制,文件删除。将这些问题放在一个单独的主题上会很复杂,而且容易出错 是否存在类似Schema Registry的工具,它支持同一主题的多个模式 更新 为了澄清,上面的每一条消息都有不
文件
),您将有多个消息架构:文件创建
,文件移动
,文件复制
,文件删除
。将这些问题放在一个单独的主题上会很复杂,而且容易出错
是否存在类似Schema Registry的工具,它支持同一主题的多个模式
更新
为了澄清,上面的每一条消息都有不同的模式。例如:
创建的文件:
{
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" }
]
}
{
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" }
]
}
{
type: "record",
name: "FileDeleted",
fields: [
{ name: "id", type: "string" },
{ name: "date", type: "long" },
{ name: "user", type: "string" }
]
}
FileMoved
:
{
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" }
]
}
{
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" }
]
}
{
type: "record",
name: "FileDeleted",
fields: [
{ name: "id", type: "string" },
{ name: "date", type: "long" },
{ name: "user", type: "string" }
]
}
文件已删除
:
{
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" }
]
}
{
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" }
]
}
{
type: "record",
name: "FileDeleted",
fields: [
{ name: "id", type: "string" },
{ name: "date", type: "long" },
{ name: "user", type: "string" }
]
}
事实上,它支持同一主题的多个模式
也就是说,最佳实践是不要对不同类型的数据使用同一主题——比如,通常不应该将页面视图事件和用户配置文件更新写入同一主题
为同一主题使用多个模式的常见示例是允许模式演变,例如,从用户配置文件的基本模式(例如,仅用户名和年龄)开始,随后将增强为用户配置文件的更全面模式(用户名、年龄、地理区域、首选语言、上次访问日期等)
您是否希望将文件创建
、文件移动
、文件复制
、文件删除
存储到同一主题中取决于您自己。在这两种情况下,Confluent Schema Registry都允许您管理相应的模式()
更具体的文档指针:
- 。要在同一主题下注册新的/多个模式,您只需通过相应的API调用注册它们。请注意,根据Avro兼容性设置,注册新模式(即当初始模式已向主题注册时)可能会失败,请参阅下一点
- (全局或为同一主题/主题注册的架构)。请参见例如
,它返回主题的(Avro架构)兼容性级别GET/config/(string:subject)
GET/config/(string:subject)
可以获得配置的兼容性级别。如果返回null,则GET/config
还有:
NONE、FULL、FORWARD、BACKWARD
。因此,如果您真的想在同一卡夫卡主题中存储(比如)完全不同的数据类型,您应该(a)将相应主题/主题的Avro模式兼容性设置为NONE
,以及(b)注册相关的Avro模式对于该主题/主题下的每种数据类型。能否提供一个更具体的链接,指向文档中支持此功能的位置?简单地通读一下,步骤7演示了如何拒绝与第一个模式不兼容的第二个模式。是否存在允许为同一主题注册多个架构的特定API或配置设置?@MarkJMiller:Edited my answer。希望这有帮助。谢谢你的澄清。如果Schema Registry允许在事件源场景中强制实施模式,那就太好了——特别是因为这是Kafka docs提出的一个解决方案。在这些场景中,实施版本兼容性的能力会很好。请注意,在事件源的情况下,模式版本兼容性及其实施与模式注册表在这方面已经提供的情况不同。事件源使用异构消息的有序日志(如我上面的示例). 如果您按消息类型拆分日志以启用向后兼容,则会失去顺序。如果要保持顺序,需要将主题的兼容性设置为NONE
。我只想将一个主题限制为一个已配置模式的列表,但我还想确保模式的新版本是向后兼容的。同样的问题,有没有办法在json中为avro模式指定“oneOf”?