Сливающийся реестр схем / потоки Kafka: предотвращение эволюции схемы

#apache-kafka #apache-kafka-streams #confluent-schema-registry

#apache-kafka #apache-kafka-streams #confluent-schema-registry

Вопрос:

Есть ли способ настроить сливающийся реестр схем и / или потоки Kafka, чтобы предотвратить эволюцию схемы?

Мотивация

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

Когда это происходит, мы можем видеть эволюцию схемы в реестре схем, как и ожидалось.

Решение

Мы проверили документацию для реестра Confluent Schema и / или потоков Kafka, но не смогли найти способ предотвратить эволюцию схемы.

Следовательно, мы рассматриваем возможность изменения заданий Kafka Streams для чтения схемы из реестра Confluent Schema перед ее отправкой. Если полученная схема соответствует локальной схеме сообщений, только тогда мы их отправляем.

Это правильный путь или мы пропустили лучший вариант?

Обновление: мы нашли статью на medium для проверки схемы в реестре схем перед отправкой.

Комментарии:

1. Вы пытались настроить SR с «полностью совместимым», каков самый строгий уровень совместимости?

2. Привет, Маттиас, спасибо, что указал на это! В итоге мы установили SR на «полностью совместимый», и это решило проблему для нас.

Ответ №1:

Это зависит от того, какой язык и библиотеку вы используете и какие API они предоставляют. Если вы публикуете общие записи, вы можете читать и анализировать .avdl или .avsc сохранять в тип записи и создавать свое событие. Это означает, что если событие, которое вы пытаетесь создать, не будет совместимо с текущей схемой, вы не сможете даже создать это событие, следовательно, не сможете изменить существующую схему. Поэтому в этом случае просто сохраните вместе с исходным кодом статическую схему. С определенной записью это более или менее одно и то же, вы можете создавать свои Java / C # или другие языковые классы на основе схемы, вы создаете их, а затем просто создаете их и публикуете. Имеет ли это какой-либо смысл?) PS. Я работал с библиотеками C # для Kafka, возможно, некоторые другие языки не имеют такой поддержки или имеют другие лучшие варианты