← Назад к вопросам

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

2.0 Middle🔥 151 комментариев
#Брокеры сообщений#Микросервисы и архитектура

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Гарантии доставки сообщений в Kafka

Kafka предоставляет три уровня гарантий доставки сообщений (delivery guarantees), которые определяют, как сообщения обрабатываются между производителем и потребителем.

At Most Once (максимум один раз)

Это самый слабый уровень гарантии:

  • Сообщение может быть потеряно, но никогда не будет доставлено дважды
  • Производитель отправляет сообщение и не ждёт подтверждения от брокера
  • Используется параметр acks=0 на стороне производителя
  • Применение: когда потеря данных допустима (например, логи метрик)
config := sarama.NewConfig()
config.Producer.RequiredAcks = sarama.NoResponse // At Most Once

At Least Once (минимум один раз)

Это средний уровень гарантии:

  • Сообщение гарантированно доставляется минимум один раз
  • Может быть доставлено несколько раз при сбоях
  • Производитель ждёт подтверждения от брокера: acks=1 или acks=all
  • Потребитель должен быть идемпотентным — обрабатывать дубликаты безопасно
  • Применение: большинство случаев (финансовые транзакции, критичные события)
config := sarama.NewConfig()
config.Producer.RequiredAcks = sarama.WaitForAll // At Least Once
config.Producer.Return.Successes = true
config.Producer.Retry.Max = 3

Exactly Once (ровно один раз)

Это самый сильный уровень гарантии:

  • Сообщение доставляется ровно один раз, без потерь и дубликатов
  • Достигается комбинацией: acks=all + enable.idempotence=true
  • На стороне потребителя: идемпотентная обработка + управление смещением (offset)
  • Применение: критичные операции (переводы денег, изменение баланса счёта)
config := sarama.NewConfig()
config.Producer.RequiredAcks = sarama.WaitForAll
config.Producer.Idempotent = true
config.Producer.Flush.Messages = 1

Практические аспекты

На стороне производителя:

  • acks=all — ждём подтверждения от лидера и всех in-sync replicas
  • retries — повторные попытки при ошибках
  • compression.type — сжатие для оптимизации

На стороне потребителя:

  • Сохранять offset после успешной обработки сообщения
  • Реализовать идемпотентность операций (проверка дубликатов)
  • Использовать транзакции для атомарной обработки

Компромисс: надёжность vs производительность

Чем выше уровень гарантии, тем ниже пропускная способность и выше латенция. Go-разработчик должен выбирать уровень гарантии в зависимости от требований приложения.

Вывод: Kafka гарантирует порядок сообщений внутри партиции и предоставляет гибкие механизмы для выбора нужного уровня надёжности.