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

Что такое acks в Kafka?

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

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

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

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

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=0acks=1acks=all
НадёжностьМинимальнаяСредняяМаксимальная
Гарантияat-most-onceat-least-onceexactly-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 в зависимости от критичности данных.