Ответ
Kafka предоставляет три уровня гарантий доставки сообщений, которые настраиваются в продюсере:
At most once (не более одного раза)
- Суть: Сообщение отправляется один раз и не повторяется в случае ошибки. Это может привести к потере сообщения.
- Настройка: Продюсер устанавливает
acks=0
. Он не ждет подтверждения от брокера и сразу считает сообщение отправленным. - Применение: Сбор некритичных данных, где производительность важнее надежности (например, сбор логов или метрик).
At least once (не менее одного раза)
- Суть: Сообщение гарантированно будет доставлено, но в случае сбоя сети или брокера возможны повторные отправки (дубли).
- Настройка: Продюсер устанавливает
acks=1
(ждет подтверждения от лидера партиции) илиacks=all
(ждет подтверждения от всех синхронизированных реплик) и выполняет повторные попытки отправки при ошибках. - Применение: Самый распространенный сценарий, когда потеря данных недопустима, а обработка дублей реализуется на стороне консьюмера (например, через идемпотентные операции).
Exactly once (строго один раз)
- Суть: Каждое сообщение доставляется и обрабатывается ровно один раз. Это самая строгая, но и самая ресурсоемкая гарантия.
- Настройка: Достигается комбинацией механизмов на стороне продюсера и консьюмера:
- Идемпотентный продюсер:
enable.idempotence=true
. Продюсер присваивает каждому сообщению уникальный ID, что позволяет брокеру отсеивать дубли. - Транзакции: Для атомарной отправки сообщений в несколько партиций (например, в рамках паттерна
read-process-write
). - Надежное подтверждение:
acks=all
является обязательным.
- Идемпотентный продюсер:
- Применение: Критически важные системы, такие как финансовые транзакции, обработка заказов, где потеря или дублирование данных недопустимы.
Для достижения end-to-end exactly-once семантики консьюмер также должен работать в транзакционном режиме или использовать идемпотентные методы для обработки сообщений.