✉️ Пост 41. Идемпотентный продюсер в Kafka - что это и зачем он нужен
Когда сервисы отправляют сообщения в Kafka, почти всегда есть риск дублей
Типичный сценарий:
• продюсер отправил сообщение • брокер его записал • ответ продюсеру не дошёл (например, сеть лагнула) • продюсер думает, что сообщение не доставлено • и отправляет его ещё раз
В итоге в Kafka может появиться два одинаковых сообщения.
А если представить, что это событие:
• списания денег • создания заказа • начисления бонусов
Дубликаты тут могут привести к очень неприятным последствиям.
И вот для решения этой проблемы в Kafka существует идемпотентный продюсер.
🧠 Что такое идемпотентный продюсер
Идемпотентный продюсер - это продюсер Kafka, который гарантирует, что одно и то же сообщение не будет записано в топик несколько раз, даже если произошёл retry.
То есть:
даже если продюсер повторно отправил сообщение, Kafka поймёт, что это дубликат, и не запишет его второй раз.
⚙️ Как это работает
Когда включена настройка
enable.idempotence=true
Kafka делает несколько вещей:
1️⃣ Продюсер получает уникальный producerId 2️⃣ Для каждой партиции продюсер ведёт sequence number - счётчик сообщений
Например:
сообщение 1 -> sequence = 0 сообщение 2 -> sequence = 1 сообщение 3 -> sequence = 2
3️⃣ При отправке сообщения продюсер передаёт брокеру служебную информацию:
• producerId • номер партиции • sequence number
4️⃣ Брокер запоминает последний номер сообщения для этого продюсера.
Если приходит сообщение с тем же sequence number - Kafka понимает, что это повторная отправка, и игнорирует его.
🔍Пример
Представим сервис заказов.
Он отправляет событие:
OrderCreated
Сообщение:
{ "orderId": 123, "status": "CREATED" }
Сценарий:
1️⃣ продюсер отправляет сообщение
2️⃣ брокер записывает его в топик
3️⃣ ответ продюсеру не доходит
4️⃣ продюсер повторяет отправку
Без идемпотентности в топике будет:
OrderCreated(123) OrderCreated(123)
С идемпотентным продюсером Kafka увидит повторный sequence number и второе сообщение не запишет.
В топике останется только одно событие.
🚀Как включить
Нужно просто включить настройку продюсера:
enable.idempotence=true
Обычно вместе с этим Kafka автоматически включает безопасные параметры:
• acks=all • retries больше 0
⚠️ Важный момент
Идемпотентность Kafka защищает только от технических дублей, которые возникают из-за retry.
Она не защищает от бизнес-дублей.
Например, если сервис два раза отправил событие создания заказа с разными sequence number - Kafka их оба запишет.
Поэтому для критичных операций часто дополнительно используют бизнес-идемпотентность (например, idempotency key).