Какие брокеры сообщений вы использовали? Сравните их и расскажите о сценариях применения каждого.

Ответ

Я работал с такими брокерами, как RabbitMQ, Apache Kafka и NATS. Каждый из них имеет свои сильные стороны и подходит для разных задач.

Сравнение брокеров

Характеристика RabbitMQ Apache Kafka NATS (с JetStream)
Основная модель Smart-брокер, dumb-клиент (AMQP) Dumb-брокер, smart-клиент (лог коммитов) Pub/Sub, потоки
Сценарии Задачи (task queues), сложная маршрутизация, RPC Потоковая обработка данных, Event Sourcing, сбор логов и метрик Микросервисная коммуникация, IoT, системы с низкой задержкой
Гарантии доставки At-least-once, At-most-once At-least-once, Exactly-once At-least-once, At-most-once, Exactly-once (в потоке)
Производительность Хорошая, но ниже чем у Kafka Очень высокая (high-throughput) Экстремально высокая, низкая задержка

Подробнее о каждом

RabbitMQ:

  • Описание: Традиционный брокер сообщений, реализующий протокол AMQP. Отличается гибкой маршрутизацией благодаря концепциям обменников (exchanges) и очередей.
  • Когда использовать: Идеален для систем, где важна гарантированная доставка сообщений по сложным правилам, а также для организации очередей задач для воркеров.
  • Пример (отправка):
    // Клиент: github.com/rabbitmq/amqp091-go
    conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
    ch, err := conn.Channel()
    // Объявляем очередь для надежности
    q, err := ch.QueueDeclare("task_queue", true, false, false, false, nil)
    // Публикуем сообщение
    err = ch.Publish("", q.Name, false, false, amqp.Publishing{Body: []byte("new task")})

Apache Kafka:

  • Описание: Распределенная стриминговая платформа. Работает как неизменяемый лог коммитов (commit log), куда продюсеры пишут события, а консьюмеры их читают со своей скоростью.
  • Когда использовать: Для сценариев с огромным потоком данных (логи, метрики, IoT-данные), Event Sourcing, аналитики в реальном времени.
  • Пример (отправка):
    // Клиент: github.com/IBM/sarama
    producer, err := sarama.NewSyncProducer([]string{"localhost:9092"}, nil)
    msg := &sarama.ProducerMessage{Topic: "orders", Value: sarama.StringEncoder("order_created")}
    partition, offset, err := producer.SendMessage(msg)

NATS:

  • Описание: Простой, легковесный и очень быстрый брокер. Изначально работал по модели "fire-and-forget" (Pub/Sub), но с появлением JetStream получил персистентность, гарантированную доставку и потоковую обработку.
  • Когда использовать: Для межсервисного взаимодействия в микросервисах, где критична низкая задержка. С JetStream — как более простая альтернатива Kafka.
  • Пример (отправка):
    // Клиент: github.com/nats-io/nats.go
    nc, err := nats.Connect(nats.DefaultURL)
    // Простая публикация без гарантий
    err = nc.Publish("updates", []byte("data"))
    // Публикация в персистентный поток JetStream
    js, err := nc.JetStream()
    _, err = js.Publish("ORDERS.new", []byte("order data"))