В чём разница между микросервисами, взаимодействующими через API и через брокер сообщений?

«В чём разница между микросервисами, взаимодействующими через API и через брокер сообщений?» — вопрос из категории Архитектура, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Разница заключается в модели взаимодействия: синхронный запрос-ответ против асинхронной передачи событий.

Взаимодействие через API (REST/gRPC):

  • Синхронное: Сервис-вызыватель отправляет запрос и блокируется, ожидая немедленного ответа.
  • Прямая связь: Создаёт явную зависимость между сервисами.
  • Пример (Python с requests):
    import requests
    # Синхронный вызов User Service
    response = requests.get('http://user-service/api/users/123')
    user_data = response.json()

Взаимодействие через брокер сообщений (Kafka, RabbitMQ):

  • Асинхронное: Сервис-издатель отправляет сообщение в очередь/топик и продолжает работу, не ожидая ответа. Сервис-подписчик обрабатывает сообщение, когда сможет.
  • Развязанная связь: Сервисы не знают друг о друге, общаясь только через брокер.
  • Пример (Python с Pika для RabbitMQ):
    import pika
    connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
    channel = connection.channel()
    channel.queue_declare(queue='order_created')
    # Асинхронная публикация события
    channel.basic_publish(exchange='', routing_key='order_created', body='{"orderId": 456}')
    connection.close()

Ключевые отличия:

  1. Связность: API создаёт жёсткие зависимости, брокер сообщений — слабые.
  2. Отказоустойчивость: Брокер сохраняет сообщения при временной недоступности сервиса-потребителя.
  3. Масштабируемость: Брокер лучше буферизует пиковые нагрузки.
  4. Архитектурный стиль: API для прямого взаимодействия, брокер — для событийно-ориентированной архитектуры (EDA).