Какие гарантии доставки сообщений предоставляет Kafka?

Ответ

Kafka предоставляет три уровня гарантий доставки сообщений, которые настраиваются в продюсере:

  1. At most once (не более одного раза)

    • Суть: Сообщение отправляется один раз и не повторяется в случае ошибки. Это может привести к потере сообщения.
    • Настройка: Продюсер устанавливает acks=0. Он не ждет подтверждения от брокера и сразу считает сообщение отправленным.
    • Применение: Сбор некритичных данных, где производительность важнее надежности (например, сбор логов или метрик).
  2. At least once (не менее одного раза)

    • Суть: Сообщение гарантированно будет доставлено, но в случае сбоя сети или брокера возможны повторные отправки (дубли).
    • Настройка: Продюсер устанавливает acks=1 (ждет подтверждения от лидера партиции) или acks=all (ждет подтверждения от всех синхронизированных реплик) и выполняет повторные попытки отправки при ошибках.
    • Применение: Самый распространенный сценарий, когда потеря данных недопустима, а обработка дублей реализуется на стороне консьюмера (например, через идемпотентные операции).
  3. Exactly once (строго один раз)

    • Суть: Каждое сообщение доставляется и обрабатывается ровно один раз. Это самая строгая, но и самая ресурсоемкая гарантия.
    • Настройка: Достигается комбинацией механизмов на стороне продюсера и консьюмера:
      • Идемпотентный продюсер: enable.idempotence=true. Продюсер присваивает каждому сообщению уникальный ID, что позволяет брокеру отсеивать дубли.
      • Транзакции: Для атомарной отправки сообщений в несколько партиций (например, в рамках паттерна read-process-write).
      • Надежное подтверждение: acks=all является обязательным.
    • Применение: Критически важные системы, такие как финансовые транзакции, обработка заказов, где потеря или дублирование данных недопустимы.

Для достижения end-to-end exactly-once семантики консьюмер также должен работать в транзакционном режиме или использовать идемпотентные методы для обработки сообщений.