Конфлюентная схема реестра Avro Schema

Привет, я хотел бы использовать реестр схем Confluent с сериализаторами Avro: документация теперь в основном говорит: не используйте одну и ту же схему для нескольких разных themes

Кто-нибудь может мне объяснить, почему? Я повторно исследую исходный код, и он в основном сохраняет схему в теме kafka следующим образом (имя темы, magicbytes, версия-> ключ) (схема-> значение)

Поэтому я не вижу проблемы использования схемы несколько раз, ожидая избыточности?


person jojo_Berlin    schedule 21.07.2016    source источник
comment
Насколько я понимаю из документации, это относится только к kafka ‹= 0.8.2. Вы должны подключить KafkaAvroEncoder к старому производителю. НО вы можете использовать KafkaAvroEncoder только для сериализации значения сообщения (не ключа) и отправлять только значение типа Avro record. Следовательно, схема Avro для значения будет зарегистрирована под субъектом recordName-value, где recordName - это имя записи Avro.   -  person TobiSH    schedule 22.07.2016
comment
Можете ли вы объяснить, почему вы пришли к выводу. В документации сейчас в основном говорится: не использовать одну и ту же схему для нескольких разных тем? Я не вижу этой рекомендации в связанной документации.   -  person Michael G. Noll    schedule 22.07.2016


Ответы (1)


Я думаю, вы имеете в виду этот комментарий в документации:

Мы рекомендуем пользователям использовать нового производителя в org.apache.kafka.clients.producer.KafkaProducer. Если вы используете версию Kafka старше 0.8.2.0, вы можете подключить KafkaAvroEncoder к старому производителю в kafka.javaapi.producer. Однако будут некоторые ограничения. Вы можете использовать KafkaAvroEncoder только для сериализации значения сообщения и отправлять только значение типа Avro record. Схема Avro для значения будет зарегистрирована под субъектом recordName-value, где recordName - имя записи Avro. По этой причине один и тот же тип записи Avro не следует использовать более чем в одной теме.

Во-первых, комментатор выше прав - это относится только к старому API производителя до 0.8.2. В любом случае настоятельно рекомендуется использовать нового производителя, поскольку это гораздо лучшая реализация, не зависит от всего ядра jar и является клиентом, который будет поддерживаться в будущем (конкретной временной шкалы пока нет, но старый производитель в конечном итоге будет объявлен устаревшим, а затем удален).

Однако, если вы используете старый производитель, это ограничение требуется только в том случае, если схема для двух субъектов может развиваться отдельно. Предположим, вы написали два приложения, которые писали по разным темам, но использовали один и тот же тип записи Avro, назовем его record. Теперь оба приложения зарегистрируют / найдут его в теме record-value и получат version=1. Это все нормально, пока схема не меняется. Но скажем, приложению A теперь нужно добавить поле. Когда это произойдет, схема будет зарегистрирована под субъектом record-value и получит присвоение version=2. Это нормально для приложения A, но приложение B либо не было обновлено для обработки этой схемы, либо, что еще хуже, схема даже не действительна для приложения B. Однако вы теряете защиту реестра схемы. обычно дает вам - теперь какое-то другое приложение может публиковать данные этого формата в теме, используемой приложением B (это выглядит нормально, потому что record-value зарегистрировала эту схему). Теперь приложение B может видеть данные, с которыми оно не знает, как обрабатывать, поскольку это не поддерживаемая им схема.

Итак, краткая версия заключается в том, что, поскольку со старым производителем объект должен быть разделен, если вы также используете ту же схему, вы в конечном итоге объединяете два приложения и схемы, которые они должны поддерживать. Вы можете использовать одну и ту же схему для разных тем, но мы рекомендуем этого не делать, поскольку она объединяет ваши приложения (и их разработку, команды, разрабатывающие их, и т. Д.).

person Ewen Cheslack-Postava    schedule 23.07.2016