Ответ
Разница заключается в модели взаимодействия: синхронный запрос-ответ против асинхронной передачи событий.
Взаимодействие через 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()
Ключевые отличия:
- Связность: API создаёт жёсткие зависимости, брокер сообщений — слабые.
- Отказоустойчивость: Брокер сохраняет сообщения при временной недоступности сервиса-потребителя.
- Масштабируемость: Брокер лучше буферизует пиковые нагрузки.
- Архитектурный стиль: API для прямого взаимодействия, брокер — для событийно-ориентированной архитектуры (EDA).