Какие гарантии доставки сообщений предоставляет 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 семантики консьюмер также должен работать в транзакционном режиме или использовать идемпотентные методы для обработки сообщений.

Ответ 18+ 🔞

Слушай, а вот эта твоя Кафка, она ж не просто так, блядь, называется. Там с доставкой сообщений целый ёперный театр разворачивается, три уровня, как в лифте! И если не разобраться — можно так наебнуться, что потом волосы дыбом.

1. Ну, типа, «Может, долетит, а может, и хуй с ним» (At most once)

  • Суть: Отправил сообщение и тут же про него забыл, как будто в чёрную дыру кинул. Если брокер его не поймал — ну и похуй, пропало нахуй. Потеря гарантирована, как совесть у политика.
  • Как включить эту дичь: В продюсере ставишь acks=0. Он чихнул — и в ус не дует, подтверждения ни от кого не ждёт.
  • Где применять: Ну, для какой-нибудь хуйни, которую не жалко. Счётчики посещений, логи, которые и так в овердохуища экземплярах пишутся. Производительность — всё, надёжность — нихуя.

2. «Однозначно долетит, но может и дважды в одну дырку» (At least once)

  • Суть: Сообщение точно не потеряется, мы будем долбиться им, пока не прилетит подтверждение. Но если что-то пошло не так на пути, можем отправить его ещё разок. И вот тебе, сука, дубль в твоём топике. Самый популярный вариант, потому что народ боится потерь больше, чем дублей.
  • Как настроить: Ставишь acks=1 (подтверждение от главного брокера в партиции) или, для полного параноидального счастья, acks=all (ждёшь, пока все его реплики кивнут). И обязательно включаешь повторные попытки.
  • Где применять: Практически везде! Но тут, блядь, надо свою жопу подстелить — консьюмер должен уметь обрабатывать одинаковые сообщения, не сломав систему. Идемпотентность, вся эта хуйня.

3. «Идеальный мир, блядь» (Exactly once)

  • Суть: Каждое сообщение прилетает и обрабатывается ровно ОДИН раз. Ни больше, ни меньше. Мечта, а не гарантия. Но за неё, ясное дело, надо платить — сложностью и ресурсами.
  • Как добиться, чтоб не обосраться: Тут уже не просто кнопку ткнуть.
    • Включаешь идемпотентного продюсера: enable.idempotence=true. Он каждому сообщению уникальный ID прилепит, и брокер, такой бдительный, отсеет дубликаты нахуй.
    • Можешь ещё транзакции включить: Если тебе надо атомарно записать в несколько топиков сразу. Чтоб либо всё записалось, либо нихуя.
    • И acks=all — обязательно! Без этого нихуя не выйдет.
  • Где применять: В самых ответственных местах, где от каждого байта зависит твоя зарплата или репутация. Финансовые переводы, заказы, обновления балансов. Потерял или продублировал — пиши пропало.

И главное, чувак, запомни: чтобы эта магия «ровно один раз» работала от начала и до конца, консьюмер тоже должен быть в доле! Либо через транзакции подтверждать обработку, либо быть идемпотентным. А иначе получится «ровно один раз отправили, но обработали три раза» — и ты сидишь такой, сам от себя охуевший.