← Назад к вопросам
Что происходит с системой когда все брокеры сломались в 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));
Процесс восстановления:
- Broker восстанавливается и становится доступен
- Producer переподключается и отправляет буферизованные сообщения
- Consumer восстанавливает подключение и продолжает читать
- Если был 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: не может читать, остаётся в ожидании
- Данные: физически сохранены на дисках, но недоступны
- Восстановление: автоматическое при восстановлении хотя бы одного брокера