У меня есть следующие три схемы Avro:
Как видно, тип my.domain.kafka.api.User упоминается в двух других схемах. Для генерации DTO схем я использую java avro-tool-1.9.1.jar:
Эта команда без проблем компилирует 3 файла. То же самое можно добиться с помощью плагина maven "org.apache.avro:avro-maven-plugin", предоставив исходный каталог схемам.
Проблема начинается с Kafka Topology Builder< /strong> (https://kafka-topology-builder.readthedocs.io/) . В качестве конфигурации определен следующий файл yaml:
Однако Kafka Topology Builder не может найти my.domain.kafka.api.User путем компиляции user-create.avsc или user-deactivate.avsc. Возникают следующие исключения:
Похоже, что Kafka Topology Builder берет одну схему за другой и пытается скомпилировать, не используя весь список схем в определенном порядке, как ожидалось. Есть ли какой-нибудь трюк, который я забыл определить в файле yaml, или Builder вообще его не поддерживает?
Одним грязным обходным путем было бы определение конкретного "Пользователя" для каждой схемы, но это действительно нехорошо.
{
"name": "User",
"namespace": "my.domain.kafka.ap",
"type": "record",
"fields": [
{
"name": "userId",
"type": {
"type": "string",
"logicalType": "uuid"
}
}
]
}
{
"name": "UserCreate",
"namespace": "my.domain.kafka.api",
"type": "record",
"fields": [
{
"name": "timestamp",
"type": {
"type": "long",
"logicalType": "timestamp-millis"
}
},
{
"name": "id",
"type": {
"type": "string",
"logicalType": "uuid"
}
},
{
"name": "user",
"type": [
"null",
"my.domain.kafka.api.User"
],
"default": null
}
]
}
{
"name": "UserDeactivate",
"namespace": "my.domain.kafka.api",
"type": "record",
"fields": [
{
"name": "timestamp",
"type": {
"type": "long",
"logicalType": "timestamp-millis"
}
},
{
"name": "id",
"type": {
"type": "string",
"logicalType": "uuid"
}
},
{
"name": "user",
"type": [
"null",
"my.domain.kafka.api.User"
],
"default": null
}
]
}
java -jar avro-tool-1.9.1.jar compile schema user.avsc user-create.avsc user-deactivate.avsc
projects:
- name: "my-project"
...
topics:
- name: "my-topic"
subject.name.strategy: "TopicRecordNameStrategy"
schemas:
- value.schema.file: "../schemas/user.avsc"
value.record.type: "my.domain.kafka.api.User"
- value.schema.file: "../schemas/user-create.avsc"
value.record.type: "my.domain.kafka.api.UserCreate"
- value.schema.file: "../schemas/user-deactivate.avsc"
value.record.type: "my.domain.kafka.api.UserDeactivate"
config:
...
Exception in thread "main" org.apache.avro.SchemaParseException: Undefined name: "my.domain.kafka.api.User"