Ответ
Apache Kafka — это не просто очередь сообщений, а распределенная стриминговая платформа. Её стоит выбирать, когда в основе архитектуры лежат потоки событий (event streams) и требуется их надежная обработка и хранение.
Ключевые сценарии использования:
Event-Driven архитектура и Event Sourcing: Когда необходимо иметь долговечный, реплицируемый и перечитываемый лог всех событий в системе. Kafka позволяет сервисам подписываться на события и реагировать на них, а также восстанавливать свое состояние, перечитав топик с самого начала.
Высоконагруженная аналитика и сбор метрик: Для сбора и обработки больших потоков данных в реальном времени, таких как кликстрим, логи, данные с IoT-устройств.
Асинхронная коммуникация и слабая связанность: Для decoupling'а (развязывания) сервисов. Продюсеру не нужно знать о консьюмерах и ждать их ответа. Это повышает отказоустойчивость системы.
Агрегация логов: Централизованный сбор логов со всех микросервисов в одном месте для дальнейшего анализа.
Репликация данных: Для синхронизации данных между различными хранилищами или дата-центрами.
Пример отправки сообщения на Go (библиотека sarama
):
// Создаем синхронного продюсера, который ждет подтверждения от брокера
producer, err := sarama.NewSyncProducer([]string{"kafka:9092"}, nil)
if err != nil {
log.Fatalln("Failed to start Sarama producer:", err)
}
defer producer.Close()
msg := &sarama.ProducerMessage{
Topic: "user-events",
Value: sarama.StringEncoder("User registered with id 123"),
}
// Отправляем сообщение и получаем partition/offset
partition, offset, err := producer.SendMessage(msg)
if err != nil {
log.Printf("FAILED to send message: %sn", err)
} else {
log.Printf("Message sent to partition %d at offset %dn", partition, offset)
}
Когда Kafka может быть избыточен:
- Для простых синхронных RPC-вызовов (лучше gRPC/REST).
- В системах, где нужна сложная логика маршрутизации сообщений (RabbitMQ может подойти лучше).
- В небольших проектах, где накладные расходы на поддержку кластера Kafka неоправданны.