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

Что происходит с системой когда все брокеры сломались в Kafka

2.7 Senior🔥 141 комментариев
#Docker, Kubernetes и DevOps#Брокеры сообщений

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

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

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

Что происходит с системой когда все брокеры сломались в Kafka

Когда все брокеры в Kafka кластере становятся недоступны, система переходит в состояние полного отказа. Это критическая ситуация, которую нужно понимать при работе с Kafka в production.

Поведение Producer (производитель)

Когда producer пытается отправить сообщение, а все брокеры недоступны:

KafkaProducer<String, String> producer = new KafkaProducer<>(props);
Future<RecordMetadata> future = producer.send(
    new ProducerRecord<>("topic", "key", "value")
);

try {
    future.get();
} catch (ExecutionException e) {
    System.err.println("Send failed: " + e.getCause());
}

Что происходит:

  • Producer попытается переподключиться согласно конфигурации
  • После исчерпания попыток подключения выбросит TimeoutException
  • Сообщения остаются в буфере отправки (в памяти producer)
  • Если буфер переполнится — выбросится BufferExhaustedException

Поведение Consumer (потребитель)

Потребители сталкиваются с проблемой:

KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(Arrays.asList("topic"));

while (true) {
    try {
        ConsumerRecords<String, String> records = consumer.poll(Duration.ofSeconds(1));
    } catch (OffsetOutOfRangeException e) {
        System.err.println("Error: " + e.getMessage());
    }
}

Что происходит:

  • Consumer не может получить metadata о партициях
  • Poll() вернёт пустой результат и будет ждать
  • Consumer группа не сможет rebalancировать
  • После timeout произойдёт GroupCoordinatorNotAvailableException

Потеря данных

Отправленные сообщения:

  • Если producer использует acks=all, сообщения не будут подтверждены
  • Сообщения останутся в буфере producer'а
  • После истечения timeout'а потеряются

Поступающие сообщения:

  • Consumer не может читать новые сообщения
  • Данные остаются на дисках брокеров (физически они не потеряны)
  • Но приложение не может их получить

Восстановление

После восстановления хотя бы одного брокера:

producer.send(new ProducerRecord<>("topic", "value"));
ConsumerRecords<String, String> records = consumer.poll(Duration.ofSeconds(1));

Процесс восстановления:

  1. Broker восстанавливается и становится доступен
  2. Producer переподключается и отправляет буферизованные сообщения
  3. Consumer восстанавливает подключение и продолжает читать
  4. Если был leader election — consumer переподстраивается

Лучшие практики

1. Конфигурация Producer'а для надёжности:

props.put("acks", "all");
props.put("retries", 3);
props.put("retry.backoff.ms", 1000);
props.put("delivery.timeout.ms", 120000);

2. Обработка ошибок:

producer.send(
    new ProducerRecord<>("topic", "value"),
    (metadata, exception) -> {
        if (exception != null) {
            logger.error("Failed to send message", exception);
            saveForRetry("topic", "value");
        }
    }
);

3. Мониторинг и алерты:

  • Отслеживай недоступность брокеров
  • Настрой алерты на OutOfSyncReplicas
  • Проверяй disk space и CPU load

4. Архитектура:

  • Используй multiple Kafka clusters
  • Настрой Mirror Maker для репликации
  • Имей fallback mechanism в приложении

Резюме

Когда все брокеры сломались:

  • Producer: сообщения остаются в буфере, затем теряются
  • Consumer: не может читать, остаётся в ожидании
  • Данные: физически сохранены на дисках, но недоступны
  • Восстановление: автоматическое при восстановлении хотя бы одного брокера