Ответ
API-композиция (API Composition) — это паттерн, при котором создается специальный сервис-композитор (или используется API Gateway) для объединения данных из нескольких микросервисов в один ответ. Этот паттерн решает проблему "chatty client", когда клиенту приходится делать множество отдельных запросов для отображения одной страницы или выполнения одной операции.
Основная идея: Клиент делает один высокоуровневый запрос, а сервис-композитор выполняет всю "оркестровку" — параллельно или последовательно вызывает нужные микросервисы, обрабатывает их ответы и формирует единый результат.
Пример: Композиция данных о пользователе и его заказах
Представим, что нам нужно получить профиль пользователя и список его последних заказов. Это данные из двух разных микросервисов: users-service
и orders-service
.
import asyncio
from fastapi import FastAPI
import httpx
app = FastAPI(title="API Composer")
# Адреса внутренних сервисов
USERS_SERVICE = "http://users-service/users"
ORDERS_SERVICE = "http://orders-service/orders"
@app.get("/composite/user-profile/{user_id}")
async def get_user_profile(user_id: int):
async with httpx.AsyncClient() as client:
# Параллельно запрашиваем данные из двух сервисов
user_req = client.get(f"{USERS_SERVICE}/{user_id}")
orders_req = client.get(f"{ORDERS_SERVICE}?user_id={user_id}")
user_res, orders_res = await asyncio.gather(
user_req,
orders_req
)
user_res.raise_for_status()
orders_res.raise_for_status()
# Собираем единый ответ
return {
"profile": user_res.json(),
"recent_orders": orders_res.json()
}
Преимущества:
- Упрощение клиента: Клиентскому приложению не нужно знать о внутренней структуре микросервисов.
- Снижение сетевой нагрузки: Один запрос от клиента вместо множества.
- Оптимизация: Композитор может выполнять запросы к внутренним сервисам параллельно, ускоряя получение ответа.
Недостатки:
- Дополнительная точка отказа: Если сервис-композитор падает, вся связанная с ним функциональность становится недоступной.
- Риск усложнения: Композитор может превратиться в "монолитный шлюз", который сложно поддерживать.