← Назад к вопросам
Какие гарантии доставки сообщений предоставляет 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 replicasretries— повторные попытки при ошибкахcompression.type— сжатие для оптимизации
На стороне потребителя:
- Сохранять offset после успешной обработки сообщения
- Реализовать идемпотентность операций (проверка дубликатов)
- Использовать транзакции для атомарной обработки
Компромисс: надёжность vs производительность
Чем выше уровень гарантии, тем ниже пропускная способность и выше латенция. Go-разработчик должен выбирать уровень гарантии в зависимости от требований приложения.
Вывод: Kafka гарантирует порядок сообщений внутри партиции и предоставляет гибкие механизмы для выбора нужного уровня надёжности.