Выбор ответа Senior FastAPI и Pydantic обновлено
httpx.AsyncClient на каждый запрос
Вопрос
Почему создание httpx.AsyncClient() внутри каждого обработчика плохо сказывается на производительности?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Каждый клиент заново открывает TCP и TLS, пул соединений не переиспользуется. Клиент держит пул keep-alive соединений.
Варианты ответа
- httpx не поддерживает async без отдельного транспорта
- Клиент нельзя создавать внутри
async def, это блокирует цикл событий - Каждый клиент запускает свой поток, и при нагрузке их становится тысячи
- Каждый клиент заново открывает TCP и TLS, пул соединений не переиспользуетсяправильный ответ
Разбор
Клиент держит пул keep-alive соединений. Если создавать его на запрос, каждый вызов внешнего API платит за TCP-рукопожатие и TLS, задержка растёт на десятки миллисекунд, а при нагрузке кончаются сокеты. Один клиент на приложение создают в lifespan и закрывают при остановке. httpx прекрасно работает с async, а отдельных потоков на клиента он не создаёт.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.