Добавление в тему Кафки ровно один раз - PullRequest
0 голосов
/ 18 мая 2018

Начиная с 0.11, Kafka Streams предлагает одноразовые гарантии, но их определение «конец» в сквозной теме кажется «темой Кафки».

Для приложений реального времени первый «конец», как правило, не тема Кафки, а какое-то приложение, которое выводит данные - возможно, через несколько уровней и сетей - в тему Кафки.

Так Кафка предлагает что-то, что можно добавить в тему ровно один раз, перед лицом сбоев в сети, сбоев и перезапусков приложений? Или я должен использовать семантику Кафки, по крайней мере, один раз, и дедуплицировать эту тему с потенциальными дубликатами в другую точно такую ​​же тему, используя какой-то уникальный идентификатор?

Редактировать В связи с популярностью, вот конкретный случай использования. У меня есть клиент C, который создает сообщения и отправляет их на сервер S, который использует KafkaProducer для добавления этих сообщений в тему Kafka T.

Как я могу гарантировать, в лице

  • падения C, S и членов кластера Kafka
  • временные проблемы с сетью

что все сообщения, которые создает C, попадают в T ровно один раз (и - для каждого раздела - в правильном порядке)?

Я бы, конечно, заставил C переслать все сообщения, для которых он не получил подтверждение от S -> хотя бы один раз. Но чтобы сделать это ровно один раз, сообщения, которые отправляет C, должны содержать какой-то идентификатор, чтобы можно было выполнить дедупликацию. Я не знаю, как мне это сделать с Кафкой.

Ответы [ 2 ]

0 голосов
/ 27 июля 2018

Возможно, вы захотите взглянуть на функцию сжатия журнала kafka.Он будет дедуплицировать сообщения для вас, если у вас есть уникальный ключ для всех дублирующих сообщений.

https://kafka.apache.org/documentation/#compaction

Обновление:

Сжатие журнала не очень надежно, однако вы можете изменитьнекоторые настройки работают как положено.

Более эффективный способ - использовать потоки кафки.Вы можете достичь этого, используя KTables.

0 голосов
/ 30 мая 2018

Функция Кафки «точно один раз», в частности «идемпотентный производитель», может помочь вам при сбоях серверов и проблемах с сетью.

Вы можете включить идемпотентность через Producer config enable.idempotence=true, которую вы передаете как любойдругой конфиг.Это гарантирует, что каждое сообщение будет записано ровно один раз и в правильном порядке, если произойдет сбой сервера или возникнут какие-либо проблемы с сетью.

Функция Kafka «точно один раз» не обеспечивает поддержку в случае сбоя производителя.В этом случае вам потребуется написать ручной код, чтобы выяснить, какие сообщения были успешно добавлены в тему до сбоя (с помощью потребителя), и возобновить отправку с того места, где вы остановились.В качестве альтернативы вы все еще можете дедуплицировать сторону потребителя, как вы уже упоминали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...