Ответ
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 семантики консьюмер также должен работать в транзакционном режиме или использовать идемпотентные методы для обработки сообщений.
Ответ 18+ 🔞
Слушай, а вот эта твоя Кафка, она ж не просто так, блядь, называется. Там с доставкой сообщений целый ёперный театр разворачивается, три уровня, как в лифте! И если не разобраться — можно так наебнуться, что потом волосы дыбом.
1. Ну, типа, «Может, долетит, а может, и хуй с ним» (At most once)
- Суть: Отправил сообщение и тут же про него забыл, как будто в чёрную дыру кинул. Если брокер его не поймал — ну и похуй, пропало нахуй. Потеря гарантирована, как совесть у политика.
- Как включить эту дичь: В продюсере ставишь
acks=0. Он чихнул — и в ус не дует, подтверждения ни от кого не ждёт. - Где применять: Ну, для какой-нибудь хуйни, которую не жалко. Счётчики посещений, логи, которые и так в овердохуища экземплярах пишутся. Производительность — всё, надёжность — нихуя.
2. «Однозначно долетит, но может и дважды в одну дырку» (At least once)
- Суть: Сообщение точно не потеряется, мы будем долбиться им, пока не прилетит подтверждение. Но если что-то пошло не так на пути, можем отправить его ещё разок. И вот тебе, сука, дубль в твоём топике. Самый популярный вариант, потому что народ боится потерь больше, чем дублей.
- Как настроить: Ставишь
acks=1(подтверждение от главного брокера в партиции) или, для полного параноидального счастья,acks=all(ждёшь, пока все его реплики кивнут). И обязательно включаешь повторные попытки. - Где применять: Практически везде! Но тут, блядь, надо свою жопу подстелить — консьюмер должен уметь обрабатывать одинаковые сообщения, не сломав систему. Идемпотентность, вся эта хуйня.
3. «Идеальный мир, блядь» (Exactly once)
- Суть: Каждое сообщение прилетает и обрабатывается ровно ОДИН раз. Ни больше, ни меньше. Мечта, а не гарантия. Но за неё, ясное дело, надо платить — сложностью и ресурсами.
- Как добиться, чтоб не обосраться: Тут уже не просто кнопку ткнуть.
- Включаешь идемпотентного продюсера:
enable.idempotence=true. Он каждому сообщению уникальный ID прилепит, и брокер, такой бдительный, отсеет дубликаты нахуй. - Можешь ещё транзакции включить: Если тебе надо атомарно записать в несколько топиков сразу. Чтоб либо всё записалось, либо нихуя.
- И
acks=all— обязательно! Без этого нихуя не выйдет.
- Включаешь идемпотентного продюсера:
- Где применять: В самых ответственных местах, где от каждого байта зависит твоя зарплата или репутация. Финансовые переводы, заказы, обновления балансов. Потерял или продублировал — пиши пропало.
И главное, чувак, запомни: чтобы эта магия «ровно один раз» работала от начала и до конца, консьюмер тоже должен быть в доле! Либо через транзакции подтверждать обработку, либо быть идемпотентным. А иначе получится «ровно один раз отправили, но обработали три раза» — и ты сидишь такой, сам от себя охуевший.