很抱歉,如果Kafka的文档或指南中已包含此内容,如果有人可以指出我的意思,我将不胜感激。我找到了许多文档和文章,涵盖了如何在Kafka和Schema Registry中使用Avro的基础知识,但是我一直在努力寻找策略或模式,以组织如何在多个地方使用架构。
请考虑以下情形:您正在使用Kafka,Kafka Streams和KSQL构建数据处理管道。在构建该管道时,您发现自己想要创建一些可重用的逻辑和数据结构,因此您创建了将在多个主题中使用的一些数据结构。例如,您的管道处理了大量有关人员的记录,因此您想创建一个Person
模式,以用于多个主题和其他模式:
{
"type": "record",
"name": "Person",
"fields": [
{
"name": "first_name",
"type": "string"
},
{
"name": "last_name",
"type": "string"
}
]
}
您希望在多个主题(例如PeopleWithAccounts
和PeopleWhoBoughtItemX
和其他主题中使用此架构)。您还希望在其他架构中使用此架构,例如:
{
"type": "record",
"name": "Order",
"fields": [
{
"name": "itemId",
"type": "int"
},
{
"name": "purchaser",
"type": "Person"
}
]
}
在这种情况下,能够独立于主题定义Person
模式,但是仍然具有将主题用作主题的模式将是很棒的。基于Schema Registry Naming Strategies documentation,看起来 clients 可以配置为使用主题或记录作为所有主题/架构中的架构主题。但是在这种情况下,能够基于架构设置这种配置将是很好的。此外,本文档还指出,KSQL,非Java Kafka客户端和其他工具仅与TopicNameStrategy一起使用,这表明该策略需要用于那些工具/客户端将使用的主题中的消息。>
所有这些使我认为,“共享模式”的唯一合理的解决方案是在使用它的每个主题中定义共享部分(例如Person
类型)。这听起来是否合理?结论?是否有可用的工具来轻松定义“共享模式”并将其包含在其他模式中?
tl; dr:是否有任何模式/策略/最佳实践来组织Avro模式,这些模式将被多个主题用作这些主题的顶级模式或用作其他主题中的字段模式?