Golang Sarama Kafka: количество подтверждений от Kafka-брокеров
Параметр config.Producer.RequiredAcks
в Sarama управляет количеством подтверждений от Kafka-брокеров, которые требуется продюсеру для успешного завершения отправки сообщения. Этот параметр определяет баланс между надежностью доставки сообщений и производительностью.
Значения Producer.RequiredAcks
sarama.NoResponse
(0):- Продюсер не ждет никаких подтверждений от брокеров.
- Самая высокая производительность, но есть риск потери сообщений.
- Используется редко, только в случаях, когда потеря сообщений не критична.
sarama.WaitForLocal
(1):- Продюсер ждет подтверждения от только лидера партиции.
- Средний уровень надежности: сообщение будет подтверждено, если лидер записал его в свою локальную запись (без репликации).
- Быстрее, чем подтверждения от всех реплик, но менее надежно.
sarama.WaitForAll
(-1):- Продюсер ждет подтверждений от всех реплик, указанных в конфигурации
min.insync.replicas
топика. - Самый надежный вариант, но с увеличенной задержкой.
- Подходит для случаев, где требуется высокая надежность доставки сообщений.
- Продюсер ждет подтверждений от всех реплик, указанных в конфигурации
Значение sarama.WaitForLocal
Установка sarama.WaitForLocal
означает, что продюсер будет считать отправку сообщения успешной, как только лидер партиции подтвердит запись в свою локальную запись. Это обеспечивает:
- Средний уровень надежности: Лидер гарантирует, что сообщение принято, но репликация на другие брокеры еще не произошла.
- Хорошую производительность: Уменьшает задержки по сравнению с
WaitForAll
, поскольку не нужно ждать подтверждений от реплик.
Когда использовать sarama.WaitForLocal
- Когда баланс между производительностью и надежностью важен:
- Например, в системах с высокой нагрузкой, где допустимо редкое потерянное сообщение (например, при падении лидера партиции до репликации).
- Для быстрых и критичных потоков данных:
- Например, в логировании, аналитике, телеметрии, где скорость важнее абсолютной надежности.
- Когда репликация топика настроена с высокой надежностью:
- Если вы уверены, что конфигурация
min.insync.replicas
и отказоустойчивость топика в Kafka настроены правильно,WaitForLocal
может быть достаточно надежным.
- Если вы уверены, что конфигурация
Альтернативы и их использование
- Используйте
sarama.NoResponse
, если:- Потеря сообщений допустима.
- Высокая производительность является приоритетом (например, временные данные, которые легко пересоздать).
- Используйте
sarama.WaitForAll
, если:- Надежность критически важна, и потеря сообщений недопустима.
- Например, в системах финансовых транзакций, обработке заказов и т.д.
Пример настройки:
1 2 3 4 5 |
config := sarama.NewConfig() config.Producer.RequiredAcks = sarama.WaitForLocal // Ждем подтверждения от лидера config.Producer.Retry.Max = 5 // Повторы при неудаче config.Producer.Return.Successes = true // Возвращать успешные отправки |
Риски при использовании sarama.WaitForLocal
- Потеря данных при сбое лидера:
- Если лидер партиции падает до репликации сообщения, данные могут быть потеряны.
- Убедитесь, что у вас есть мониторинг и резервные системы.
- Отсутствие подтверждений от реплик:
- Другие реплики могут быть недоступны, что может привести к снижению надежности.
Вывод:
sarama.WaitForLocal
— хороший компромисс между производительностью и надежностью. Используйте его, если вам не требуется абсолютная гарантия доставки.- Если надежность данных критична, выберите
sarama.WaitForAll
и убедитесь, что ваш Kafka-кластер настроен на репликацию с учетом отказов.
Recommended Posts
Golang Sarama: настройка Partitioner
20.03.2024