Перейти к содержанию

Идемпотентность — контроль повторов

Сценарий. Объект перепроводится или перезаписывается без изменения данных, и в Kafka уходят одинаковые сообщения. Потребители вынуждены дедуплицировать их на своей стороне.

Решение. Включите флаг Идемпотентная отправка у продюсера и/или Идемпотентная обработка у консьюмера. Адаптер начнёт отсекать сообщения, содержимое которых не изменилось.

Как это работает

  1. При успешной выгрузке (обработке) сообщения адаптер сохраняет SHA-256-хэш его тела в регистр «Хэш-суммы сообщений» — по ключу записи локальной очереди.
  2. При следующей выгрузке (обработке) той же записи очереди хэш текущего тела сравнивается с сохранённым.
  3. Если хэши совпали — операция отменяется:
Направление Статус записи Текст журнала
Исходящее Выгрузка отменена «Сообщение уже выгружено»
Входящее Обработка отменена «Сообщение уже обработано»

Если содержимое изменилось — сообщение выгружается/обрабатывается как обычно, а сохранённый хэш обновляется.

Сравнение — только в рамках одной записи очереди

Адаптер сравнивает текущее состояние записи локальной очереди с её предыдущей версией. Два разных объекта (или две разные записи очереди) с одинаковым телом не считаются повторами.

Когда сообщение не уйдёт повторно

  • Пользователь перепровёл документ, не меняя данные, — тело сообщения совпало с прошлой выгрузкой.
  • Из Kafka повторно пришло то же сообщение — консьюмер с идемпотентной обработкой не вызовет обработчик второй раз.

Как форсировать повторную отправку

Автоматической перепостановки отменённых сообщений нет. Варианты — по убыванию предпочтительности:

  1. Изменить данные объекта — новое тело даст другой хэш, и сообщение уйдёт штатно.
  2. Удалить запись из регистра «Хэш-суммы сообщений» по ключу записи очереди (форма списка регистра доступна администратору).
  3. Дождаться очистки истории хэшей по сроку хранения (по умолчанию 3 дня, поле Идемпотентность на вкладке Kafka / Администрирование / Очереди) — после удаления хэша повторная выгрузка пройдёт.
  4. Временно выключить флаг идемпотентности у продюсера/консьюмера, повторить операцию и включить флаг обратно.

Смотрите также