В каких случаях для коммуникации микросервисов стоит выбрать Apache Kafka?

Ответ

Apache Kafka — это не просто очередь сообщений, а распределенная стриминговая платформа. Её стоит выбирать, когда в основе архитектуры лежат потоки событий (event streams) и требуется их надежная обработка и хранение.

Ключевые сценарии использования:


  1. Event-Driven архитектура и Event Sourcing: Когда необходимо иметь долговечный, реплицируемый и перечитываемый лог всех событий в системе. Kafka позволяет сервисам подписываться на события и реагировать на них, а также восстанавливать свое состояние, перечитав топик с самого начала.



  2. Высоконагруженная аналитика и сбор метрик: Для сбора и обработки больших потоков данных в реальном времени, таких как кликстрим, логи, данные с IoT-устройств.



  3. Асинхронная коммуникация и слабая связанность: Для decoupling'а (развязывания) сервисов. Продюсеру не нужно знать о консьюмерах и ждать их ответа. Это повышает отказоустойчивость системы.



  4. Агрегация логов: Централизованный сбор логов со всех микросервисов в одном месте для дальнейшего анализа.



  5. Репликация данных: Для синхронизации данных между различными хранилищами или дата-центрами.


Пример отправки сообщения на 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 неоправданны.