Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Parameter acks в Apache Kafka
acks — это критически важный параметр producer в Kafka, который определяет, сколько репликасов должны подтвердить получение сообщения перед тем, как producer считает запись успешной. Это напрямую влияет на надёжность доставки и производительность системы.
Три уровня acks
1. acks=0 (Fire-and-Forget)
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("acks", "0"); // Максимальная производительность, минимальная надёжность
KafkaProducer<String, String> producer = new KafkaProducer<>(props);
producer.send(new ProducerRecord<>("my-topic", "key", "value"));
// Producer НЕ ждёт подтверждения! Может быть потеря данных.
Поведение:
- Producer отправляет сообщение и сразу же продолжает работу, не дожидаясь подтверждения
- Broker может вообще не получить сообщение, и producer об этом не узнает
- Нет гарантий доставки (at-most-once)
Преимущества:
- ✅ Максимальная производительность (наивысший throughput)
- ✅ Минимальная latency
- ✅ Минимальная нагрузка на сеть
Недостатки:
- ❌ Потеря данных при сбое broker
- ❌ Потеря данных при сетевых ошибках
- ❌ Не подходит для критичных данных
Примеры использования:
- Логирование (дублируется в другие места)
- Метрики мониторинга
- Некритичная аналитика
2. acks=1 (Leader Only)
props.put("acks", "1"); // Разумный компромисс
Поведение:
- Producer ждёт, пока лидер партиции подтвердит получение сообщения
- Лидер не ждёт подтверждения от реплик (followers)
- Сообщение записывается в лог лидера и отправляется клиенту
- Followers копируют сообщение асинхронно в фоне
Гарантия:
- Сообщение гарантированно в лидере (at-least-once)
- Если лидер упадёт до репликации на followers → потеря данных
Компромисс:
- Производительность: Хорошая (быстрее, чем acks=all)
- Надёжность: Средняя (есть окно потери при сбое лидера)
Риск сценария:
Время Лидер Follower1 Follower2 Producer
| ✓ ✗ ✗ ← получит ACK
| ПАДАЕТ! ✓ ✓
| Новый лидер из Follower1/2
↓ Данные потеряны! (не было на них при падении лидера)
Примеры использования:
- Большинство production приложений
- Логи приложений
- Телеметрия
3. acks=all (или acks=-1) — Leader and In-Sync Replicas
props.put("acks", "all"); // Максимальная надёжность
props.put("min.insync.replicas", "2"); // Минимум 2 replica должны быть in-sync
Поведение:
- Producer ждёт, пока лидер И ВСЕ in-sync replicas (ISR) подтвердят получение
- ISR — это набор replicas, которые отстают от лидера не более, чем на допустимый лаг
- Только после подтверждения от всех ISR сообщение считается записанным
Гарантия:
- Сообщение гарантированно во всех active replicas (exactly-once для record)
- Даже при падении лидера данные на followers
Компромисс:
- Производительность: Низкая (медленнее всего)
- Надёжность: Максимальная
- Latency: Высокая (ждём всех replicas)
Конфигурация:
props.put("acks", "all");
props.put("retries", "3");
props.put("max.in.flight.requests.per.connection", "5");
props.put("min.insync.replicas", "2"); // Если ISR < 2, будет exception
Примеры использования:
- Платежные системы
- Финансовые транзакции
- Критичные данные, где потеря недопустима
Сравнительная таблица
| Параметр | acks=0 | acks=1 | acks=all |
|---|---|---|---|
| Надёжность | Минимальная | Средняя | Максимальная |
| Гарантия | at-most-once | at-least-once | exactly-once (record) |
| Latency | Минимальная | Средняя | Максимальная |
| Throughput | Максимальный | Хороший | Низкий |
| Риск потери | Высокий | Среднее окно | Практически ноль |
| Риск дупликатов | Нет | Да (при retry) | Да (без idempotence) |
Взаимодействие с другими параметрами
Properties props = new Properties();
// Надёжная доставка: acks + idempotence + retries
props.put("acks", "all");
props.put("enable.idempotence", true); // Дедупликация при retry
props.put("retries", "2147483647"); // Бесконечные retry (с таймаутом сессии)
props.put("max.in.flight.requests.per.connection", "5");
props.put("min.insync.replicas", "2"); // Требуем минимум 2 в ISR
KafkaProducer<String, String> producer = new KafkaProducer<>(props);
Объяснение:
enable.idempotence=true→ даже при retry дублей не будетmin.insync.replicas=2→ если упадёт node, потребуется перелидерствоretries→ автоматические повторы при ошибке
Практический пример: Выбор acks для разных сценариев
// Сценарий 1: Мониторинг метрик (потери OK)
monitoringProducerConfig.put("acks", "0");
monitoringProducerConfig.put("compression.type", "snappy");
// Сценарий 2: Логирование приложения (потери редки)
loggingProducerConfig.put("acks", "1");
loggingProducerConfig.put("retries", "3");
// Сценарий 3: Платежи (потери недопустимы)
paymentProducerConfig.put("acks", "all");
paymentProducerConfig.put("min.insync.replicas", "2");
paymentProducerConfig.put("enable.idempotence", true);
paymentProducerConfig.put("retries", Integer.MAX_VALUE);
Заключение
Параметр acks — это ключевой механизм управления надёжностью в Kafka. Выбор значения зависит от вашей толерантности к потере данных и требованиям к производительности. В production системах обычно используют acks=1 или acks=all в зависимости от критичности данных.