> Какие способы коммуникации используются между микросервисами (Python)

Уровень: senior · Роль: backend · Язык: Python · Категория: Технические вопросы

Компании: Точка, MirrorApp, Стилсофт, Сбер

Стек: Python

> Пример ответа

Короткий ответ

Основные способы коммуникации между микросервисами: синхронные - HTTP/REST, gRPC; асинхронные - message brokers (Kafka, RabbitMQ), event streaming. Выбор зависит от требований к консистентности, latency, масштабированию и сложности инфраструктуры. Для критичных по времени операций чаще используют синхронные вызовы, для фоновых задач и событийной архитектуры - асинхронные очереди. Также возможны гибридные подходы, например, REST для запрос-ответ и Kafka для событий.

Подробное объяснение

Синхронная коммуникация - сервис отправляет запрос и блокируется до получения ответа. Типичные реализации: REST over HTTP, gRPC (HTTP/2, protobuf), GraphQL. Плюсы: простота, понятность, легко дебажить. Минусы: жёсткая связность, каскадные сбои, проблемы с производительностью при высокой нагрузке.

Асинхронная коммуникация - отправитель не ждёт ответа, сообщение попадает в брокер или шину. Реализации: Kafka, RabbitMQ, NATS, AWS SQS/SNS. Плюсы: слабая связность, устойчивость к пиковым нагрузкам, возможность replay событий. Минусы: сложность обработки ошибок, eventual consistency, необходимость идемпотентности.

Также выделяют event-driven подход, где сервисы обмениваются событиями через брокер, и choreography vs orchestration (сага, process manager). Для высоконагруженных систем часто комбинируют: синхронные вызовы для запросов с низкой latency, асинхронные - для фоновых задач и интеграций.

На практике

В Python-проектах типичный стек: FastAPI или Django REST framework для REST, grpcio для gRPC, aiokafka или kombu для Kafka/RabbitMQ. Важно учитывать:

  • Для синхронных вызовов - таймауты, retry с exponential backoff, circuit breaker (например, pybreaker).
  • Для асинхронных - гарантии доставки (at-least-once, exactly-once), партиционирование, consumer groups.
  • Мониторинг: distributed tracing (OpenTelemetry), метрики latency и throughput.
  • Контракты: OpenAPI для REST, protobuf для gRPC, schema registry для Kafka.

На практике часто используют паттерн API Gateway для синхронных вызовов и отдельный event bus для событий. Например, сервис заказов публикует событие order_created в Kafka, а сервис оплаты его потребляет.

Пример кода

PYTHON
# Синхронный вызов через httpx (FastAPI)
import httpx
async def get_user(user_id: int):
async with httpx.AsyncClient() as client:
resp = await client.get(f"http://user-service/users/{user_id}", timeout=5.0)
resp.raise_for_status()
return resp.json()
# Асинхронная публикация события в Kafka (aiokafka)
from aiokafka import AIOKafkaProducer
import json
async def publish_order_created(order: dict):
producer = AIOKafkaProducer(bootstrap_servers="kafka:9092")
await producer.start()
try:
await producer.send("orders", json.dumps(order).encode(), key=str(order["id"]).encode())
finally:
await producer.stop()

Как отвечать на собеседовании

Начни с классификации: синхронные и асинхронные. Дальше перечисли основные технологии и их trade-off. Обязательно упомяни, что выбор зависит от контекста: для запрос-ответ - REST/gRPC, для событий - Kafka. Приведи пример из практики, где ты выбирал между ними. Покажи понимание проблем: идемпотентность, retry, circuit breaker, distributed tracing. Если спросят про gRPC - объясни преимущества над REST (бинарный протокол, строгая типизация, streaming). Не забудь про саги и паттерны распределённых транзакций.

Что проверяет интервьюер

  • Понимание различий между синхронной и асинхронной коммуникацией.
  • Знание конкретных технологий и их применимости.
  • Умение рассуждать о trade-off: latency, consistency, сложность.
  • Практический опыт: как обрабатывать сбои, гарантии доставки.
  • Архитектурное мышление: когда какой подход использовать.

Типичные ошибки

  • Ответ только про REST, без упоминания асинхронных подходов.
  • Игнорирование проблем распределённых систем: идемпотентность, retry, dead letter queue.
  • Утверждение, что gRPC всегда лучше REST - это не так, для простых CRUD REST часто проще.
  • Непонимание разницы между event streaming и message queue (Kafka vs RabbitMQ).
  • Отсутствие примеров из реальной практики или шаблонные фразы без деталей.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью