Короткий ответ
Межсервисный N+1 — это когда сервис A, обрабатывая список из N элементов, делает N отдельных вызовов к сервису B вместо одного batch-вызова, что резко увеличивает суммарную латентность и нагрузку на сеть и на сервис B.
Как это работает подробнее
Типичный паттерн — получить список заказов, а затем в цикле для каждого заказа отдельно запросить у User Service данные покупателя, хотя почти все запросы идут к одному и тому же сервису.
Пример кода
example.py
orders = get_orders(user_id=None, limit=100)
user_ids = list({o.user_id for o in orders})
users_by_id = user_service.get_users_batch(user_ids) # 1 вызов вместо N
for order in orders:
order.customer = users_by_id[order.user_id]Что использовать на практике
- Практика. Решения — batch-эндпоинт на стороне B, предварительная денормализация часто нужных полей, или параллельное выполнение вызовов вместо последовательного, если batch невозможен.
Подводные камни
- Риск. Распараллелить N вызовов вместо устранения их количества — это ускоряет ответ для A, но не снижает число запросов к B; добавлять batch-эндпоинт без ограничения на размер батча.