Что такое паттерны fan-out и fan-in
Что проверяют
Умеете ли вы распараллелить ввод-вывод и собрать результат, и понимаете ли цену этого: ограничение конкурентности, общий таймаут, поведение при частичном отказе. Для питониста вопрос почти всегда сводится к asyncio и к очередям в распределённом варианте.
Как отвечать
Fan-out это разбиение одной задачи на несколько независимых подзадач, запускаемых одновременно. Fan-in это ожидание подзадач и сведение их результатов в один ответ. Выигрыш в том, что время операции определяется самой медленной веткой, а не суммой всех.
async def fetch_all(ids, limit=10):
sem = asyncio.Semaphore(limit)
async def one(i):
async with sem:
return await fetch(i)
async with asyncio.TaskGroup() as tg:
tasks = [tg.create_task(one(i)) for i in ids]
return [t.result() for t in tasks]Обязательные части ответа: ограничение параллелизма семафором или пулом, общий таймаут на всю операцию с отменой зависших задач, явная политика частичного отказа. Группа задач отменяет всё при первом исключении, сбор через gather с возвратом исключений позволяет отдать то, что собралось. Для счётной нагрузки веер делается процессами, а не корутинами: в одном потоке подзадачи не ускорятся. В распределённой версии fan-out это раздача сообщения нескольким подписчикам, fan-in это агрегирующий потребитель с ключом корреляции.
Где спотыкаются
Запускают веер без ограничения. Список на несколько тысяч элементов открывает все соединения разом, упирается в лимит пула и файловых дескрипторов, а чужой сервис получает от вас нагрузочное тестирование без предупреждения.
Не продумывают частичный отказ. Одна упавшая ветка роняет весь ответ, хотя достаточно было вернуть неполный результат с пометкой. Обратная крайность тоже частая: исключения молча собираются в список результатов, никто их не проверяет, и наружу уходит обрезанный ответ под видом полного.
Забывают про хвост. Ожидание всех веток означает, что медленный ответ одной зависимости становится временем всей операции, и худшие задержки наружу хуже, чем у каждого вызова по отдельности. Лечится таймаутом с отменой и запасным значением, а не увеличением пула.