Ответ
Взаимодействие между микросервисами делится на два основных паттерна: синхронное и асинхронное.
1. Синхронное взаимодействие (Запрос-Ответ)
Один сервис делает прямой запрос к другому и ожидает ответа. Если вызываемый сервис недоступен, операция завершается ошибкой.
-
REST API (HTTP/HTTPS): Самый распространенный способ. Прост в реализации и отладке.
- Плюсы: Простота, широкая поддержка, человекочитаемость.
- Минусы: Сильная связанность сервисов, риск каскадных сбоев.
# Сервис заказов запрашивает информацию о товаре import requests try: response = requests.get('http://inventory-service/api/products/123', timeout=5) response.raise_for_status() # Проверка на ошибки HTTP product_data = response.json() except requests.RequestException as e: print(f"Не удалось получить данные о товаре: {e}")
-
gRPC: Высокопроизводительный фреймворк от Google, использующий HTTP/2 и Protocol Buffers для сериализации. Идеален для внутренних коммуникаций.
2. Асинхронное взаимодействие (Событийное)
Сервисы общаются через посредника (брокер сообщений), не ожидая немедленного ответа. Это повышает отказоустойчивость и снижает связанность.
-
Брокеры сообщений (RabbitMQ, Kafka): Сервис-отправитель публикует сообщение (событие) в очередь или топик, а сервисы-получатели подписываются на него.
- Плюсы: Слабая связанность, масштабируемость, отказоустойчивость.
- Минусы: Усложнение системы, необходимость мониторинга брокера.
# Сервис заказов публикует событие 'order_created' import pika connection = pika.BlockingConnection(pika.ConnectionParameters('rabbitmq')) channel = connection.channel() channel.queue_declare(queue='order_events') channel.basic_publish(exchange='', routing_key='order_events', body='{"order_id": 456, "status": "created"}') connection.close()
Ключевое различие: Синхронное взаимодействие создает временнýю зависимость между сервисами, а асинхронное — устраняет её, позволяя системам работать независимо друг от друга.