✉️ Пост 39. И снова про кафку. Гарантии доставки в Kafka для продюсера - что на самом деле происходит Очень частое заблуждение - «Kafka супер надежная, значит сообщение точно не потеряется» Нет. Kafka надежная ровно настолько, насколько ты ее настроил И главный параметр здесь - acks 🧠 Что вообще происходит при отправке сообщения Когда продюсер отправляет сообщение: 1️⃣ Он пишет его в лидера партиции 2️⃣ Лидер сохраняет сообщение в лог 3️⃣ Реплики копируют сообщение к себе 4️⃣ Продюсер получает подтверждение

Вопрос только один: когда считать сообщение успешно доставленным? И вот тут включается параметр acks (в простонародье - аки 😅)

⚙️ Что такое acks acks - это настройка продюсера, которая говорит: "Сколько подтверждений я хочу получить, прежде чем считать сообщение отправленным". Есть три основных режима.

🔹 acks = 0 Продюсер вообще не ждет подтверждения Он просто отправил сообщение и поехал дальше. Плюсы:

  • максимальная скорость
  • минимальная задержка Минусы:
  • сообщение может потеряться
  • если брокер упал - никто не будет в курсах

Это режим - живем быстро, умираем молодыми))

Подходит только там, где потеря допустима: всякие метрики, логи, телеметрия

🔹 acks = 1 Продюсер ждет подтверждения только от лидера партиции. Сценарий:

  • лидер записал сообщение - ответил продюсеру
  • реплики еще могут не успеть скопировать

Если лидер сразу после этого падает, а реплики не успели синхронизироваться - сообщение потеряется. Плюсы:

  • баланс скорости и надежности
  • чаще всего используется Минусы:
  • возможна потеря при падении лидера

Это режим - нормально, но не идеально

🔹 acks = all (или -1) Продюсер ждет подтверждения от всех синхронизированных реплик. Сценарий:

  • лидер записал
  • реплики записали
  • только после этого продюсер получает ack Это максимальная надежность.

Плюсы:

  • минимальный риск потери - прод-уровень Минусы:
  • выше задержка
  • ниже throughput Это режим спим спокойно, все четко, все под контролем

🧨 Но acks - это еще не все Acks = all не защищают от дублей, а дубли - еще одна проблема в кафке

Почему? Если продюсер отправил сообщение, не получил ответ (например, сеть лагнула) и решил повторить отправку, то Kafka может записать сообщение дважды. И вот тут появляется еще один параметр.

🚀 enable.idempotence = true (он включается на стороне продюсера) Если включить идемпотентного продюсера, Kafka будет:

  • отслеживать sequence
  • не записывать дубликаты
  • гарантировать exactly-once на уровне продюсера Без этого у тебя максимум at-least-once.

📦 Какие вообще бывают гарантии доставки В Kafka обычно говорят о трех уровнях: 🔹 At most once Сообщение может потеряться, но не задублируется. Это acks = 0. 🔹 At least once Сообщение точно будет доставлено, но возможны дубли. Это acks = 1 или acks = all без идемпотентности. 🔹 Exactly once Сообщение доставлено один раз без дублей. Нужно:

  • acks = all
  • enable.idempotence = true
  • корректная конфигурация retries

🧠 Что должен понимать системный аналитик Нельзя просто сказать: "Kafka надежная". Нужно понимать:

  • какие acks настроены
  • сколько реплик у топика
  • допустима ли потеря данных
  • допустимы ли дубли
  • нужен ли exactly-once

Потому что: Для логов можно acks = 0 Для платежей - только acks = all + идемпотентность Иначе потом будут вопросики от бизнеса

#системныйанализ #кафка #БрокерыСообщений