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

«Когда для взаимодействия микросервисов следует использовать асинхронные очереди сообщений?» — вопрос из категории Архитектура, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Использование брокеров сообщений (Kafka, RabbitMQ, AWS SQS) предпочтительно в сценариях, где асинхронность, надежность и слабая связь важнее немедленного ответа.

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

  • Асинхронная обработка и фоновые задачи: Отправка email-уведомлений, генерация отчетов, обработка изображений.
  • Буферизация пиковых нагрузок: Очередь накапливает запросы, предотвращая перегрузку сервиса-обработчика.
  • Повышение отказоустойчивости: Сообщения сохраняются в очереди. Если сервис-получатель упал, он обработает их после восстановления.
  • Связь «один-ко-многим» (Pub/Sub): Когда событие должно быть обработано несколькими независимыми сервисами (например, OrderPlaced → сервис логирования, сервис аналитики, сервис рекомендаций).
  • Интеграция разнородных систем: Очередь выступает универсальным буфером и транслятором между системами с разными протоколами или скоростями работы.

Пример паттерна с RabbitMQ:

// Продюсер (сервис заказов) публикует событие
channel.basicPublish(
    "order-events", // exchange
    "order.placed", // routing key
    null,
    "{"orderId": 123}".getBytes()
);
// Сервис сразу возвращает ответ клиенту "Заказ принят"

// Консьюмер (сервис нотификаций) асинхронно обрабатывает событие
DeliverCallback callback = (consumerTag, delivery) -> {
    String message = new String(delivery.getBody());
    System.out.println(" [x] Отправляем email для заказа: " + message);
    // ... логика отправки email
};
channel.basicConsume("email-queue", true, callback, tag -> {});

Итог: Очереди — это выбор для event-driven архитектуры, где важны декомпозиция, надежность и горизонтальное масштабирование потребителей.