✉️ Пост 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).

#kafka #интеграции