Как решить проблему десериализации Kafka Avro - PullRequest
0 голосов
/ 07 сентября 2018

у нас очень странное поведение с приложением, которое использует kafka avro для потребителя и производителя.

У нас есть сервер, на котором выполняется установка слияния. Все настраивается вручную, поэтому не используется слияния.

На втором сервере запущено приложение, которое использует эту сливную установку для получения запросов через тему Kafka. Этот запрос преобразуется в запрос к базе данных и отправляет ответную тему с конкретными данными.

На третьем сервере есть другое приложение, которое отправляет эти запросы приложению на сервер № 2 и получает темы ответов.

Итак, подведем итог: Сервер 1 (Confluent установка) Сервер 2 (запросить приемник и приложение-ответчик) Сервер 3 (запрос отправителя и ответа потребителя)

Я разработал для нас API-интерфейс kafka, в котором все используют потребителя и производителей со слитым avro-сериализатором и десериализатором. Когда я сейчас создаю тему запроса из моего приложения на сервере 3, мое приложение на сервере 2 получает запрос, переводит его в запрос к базе данных и отправляет обратно тему ответа, которая отличается от темы запроса. Теперь мое приложение на сервере 3 должно получить тему test-reply-topic и десериализовать его.

Моя тема test-reply-topic содержит поле "union {null, bytes} file". Таким образом, поле является необязательным, значение по умолчанию равно нулю, и тогда схема регистрируется в реестре. Теперь, если значение файла равно нулю, выдает ошибку:

Ошибка десериализации ключа / значения для раздела test-reply-topic-0 в смещение 0. Если необходимо, пожалуйста, просмотрите запись, чтобы продолжить потребление. Причина: ошибка десериализации сообщения Avro для идентификатора 6 Подробно: найдено пустых ожидаемых байтов

Если он содержит байты, он работает.

Странно то, что если я пытаюсь сделать то же самое с локального компьютера, он работает с file = null и file = некоторыми байтами. Поэтому я использую одного и того же брокера kafka, тот же API и те же значения у производителей и потребителей. Он запрашивает один и тот же идентификатор схемы из реестра на сервере и локальном компьютере.

Может быть, у кого-то есть какие-то подсказки, в чем может быть проблема, я искал эту проблему уже несколько дней и не нашел решения.

Заранее большое спасибо!

1 Ответ

0 голосов
/ 19 сентября 2018

Извините за поздний ответ. Так что оказалось, что приложение, которое имело проблемы с десериализацией, использовало старые сгенерированные Java-классы. Таким образом, он использовал старые схемы, где раньше не было типа объединения.

...