Kafka-topology-builder ссылается на схемы Avro в другой схеме Avro

1
9

У меня есть следующие три схемы 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"
Дорофей
Вопрос задан26 февраля 2024 г.

1 Ответ

2
Ермолай
Ответ получен10 сентября 2024 г.

Ваш ответ

Загрузить файл.