Есть ли способ гарантировать, что дубликаты записей не будут вставлены в тему кафки? - PullRequest
0 голосов
/ 10 сентября 2018

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

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

1 Ответ

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

Это называется точно однократной обработкой.

Возможно, вас заинтересует первая часть Kafka FAQ , в которой описаны некоторые подходы к предотвращению дублирования при производстве данных (т. Е. На стороне производителя):

Точно однажды семантика состоит из двух частей: избегая дублирования во время производства данных и избегая дублирования во время потребления данных.

Существует два подхода к получению ровно одной семантики во время производства данных:

  1. Используйте по одному записывающему устройству на раздел, и каждый раз, когда вы получаете сетевую ошибку, проверяйте последнее сообщение в этом разделе, чтобы увидеть, была ли ваша последняя запись успешной.
  2. Включите первичный ключ (UUID или что-то) всообщение и дедупликация для потребителя.

Если вы сделаете одну из этих вещей, журнал, который хосты Kafka будут без дубликатов.Однако чтение без дубликатов также зависит от некоторого сотрудничества со стороны потребителя.Если потребитель периодически проверяет свою позицию, тогда, если он терпит неудачу и перезапускается, он перезапускается с позиции контрольной точки.Таким образом, если вывод данных и контрольная точка не записаны атомарно, здесь также можно будет получить дубликаты.Эта проблема характерна для вашей системы хранения.Например, если вы используете базу данных, вы можете зафиксировать их вместе в транзакции.Загрузчик HDFS Camus, который написал LinkedIn, делает что-то подобное для загрузок Hadoop.Другой альтернативой, которая не требует транзакции, является сохранение смещения с загруженными данными и дедупликация с использованием комбинации тема / раздел / смещение.

Я думаю, что есть два улучшения, которые облегчили бы это:

  1. Идемпотентность производителя может быть достигнута автоматически и намного дешевле, если дополнительно интегрировать поддержку для этого на сервере.
  2. Существующий потребитель высокого уровня не предоставляет возможности более тонкого контроля смещений (например, для сброса вашей позиции).Мы будем работать над этим в ближайшее время
...