Какие виды коммуникаций между сервисами существуют (например, RPC, REST, pub/sub)?
Что проверяют
Умеете ли вы выбирать способ связи под задачу, а не перечислять аббревиатуры. Главная ось тут синхронное взаимодействие против асинхронного, и следом обычно спрашивают: что будет, если сервис на той стороне лёг или отвечает десять секунд.
Как отвечать
Разделите способы на две группы. Синхронные, где вызывающий ждёт ответа:
- REST поверх HTTP: JSON, понятные коды ответа, кэширование, отладка через
curl. В Python это FastAPI или Django REST framework на сервере иhttpxна клиенте; - gRPC: контракт в
.proto, бинарный Protobuf, HTTP/2, стриминг в обе стороны, клиент генерируется черезgrpcio-tools. Быстрее и строже REST, но из браузера напрямую не вызывается; - GraphQL: чаще между фронтендом и бэкендом, чем между сервисами.
Асинхронные, через брокер:
- очередь (RabbitMQ, клиент
aio-pika, поверх него Celery): сообщение забирает один потребитель из группы, так раздают задачи; - pub/sub (Kafka через
aiokafka, NATS, Redis Pub/Sub): событие получают все подписчики. Kafka хранит лог и позволяет перечитать события, Redis Pub/Sub ничего не хранит, и отключённый подписчик сообщение теряет.
Дальше компромиссы. Синхронный вызов проще, но связывает сервисы по доступности: цепочка из пяти вызовов падает, если упал любой. Нужны таймауты, повторы с backoff и circuit breaker. Брокер развязывает сервисы, но приносит доставку «хотя бы один раз», дубли и отсутствие мгновенного ответа. Хороший итог: запросы, где ответ нужен сразу, идут через REST или gRPC, а события вроде «заказ создан» уходят в брокер.
Где спотыкаются
Путают очередь и pub/sub. В очереди конкурирующие потребители делят сообщения между собой, в pub/sub каждый подписчик получает свою копию.
Не делают потребителя идемпотентным. При доставке «хотя бы один раз» повтор неизбежен, и без ключа идемпотентности оплата спишется дважды.
Забывают про таймауты. У requests таймаута по умолчанию нет, и зависший сосед держит воркер бесконечно. У httpx он есть, 5 секунд, но его стоит задавать явно под каждый вызов.