要明确的是,我并不是想将Kafka用作事件采购的数据存储,而只是为了复制事件。
Kafka的Confluent Schema Registry似乎非常有趣,因为它可以验证生产者发送给主题的消息的模式。但是,根据我的理解,它将每个主题视为容器文件 - 每个主题一个模式。
此限制不适用于事件源流,对于像File
这样的单个聚合,您将拥有多个消息架构:FileCreated
,FileMoved
,{{1} },FileCopied
。将每个这些都放在一个单独的主题上会很复杂且容易出错。
是否存在Schema Registry这样的工具,它支持同一主题的多个模式?
更新
为了澄清,上面的每条消息都有不同的架构。例如:
FileDeleted
:
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
答案 0 :(得分:3)
Confluent Schema Registry确实支持同一主题的多个模式。
尽管如此,最佳做法是不对不同类型的数据使用相同的主题 - 例如,您通常不应将页面视图事件和用户配置文件更新写入同一主题。
对同一主题使用多个模式的一个常见示例是允许模式演变,例如,从用户配置文件的基本架构开始(例如只是用户名和年龄),随后将增强为用户配置文件的更完整的架构(用户名,年龄,地理区域,首选语言,上次访问日期,。 ..)。
您是否要将FileCreated
,FileMoved
,FileCopied
,FileDeleted
存储到同一主题中取决于您。在任何一种情况下,Confluent Schema Registry都允许您管理相应的模式(see docs)。
更具体的文档指针:
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该主题/主题下每种数据类型的模式。