Выбор ответа Senior FastAPI и Pydantic обновлено

httpx.AsyncClient на каждый запрос

Вопрос

Почему создание httpx.AsyncClient() внутри каждого обработчика плохо сказывается на производительности?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Каждый клиент заново открывает TCP и TLS, пул соединений не переиспользуется. Клиент держит пул keep-alive соединений.

Варианты ответа

  1. httpx не поддерживает async без отдельного транспорта
  2. Клиент нельзя создавать внутри async def, это блокирует цикл событий
  3. Каждый клиент запускает свой поток, и при нагрузке их становится тысячи
  4. Каждый клиент заново открывает TCP и TLS, пул соединений не переиспользуетсяправильный ответ

Разбор

Клиент держит пул keep-alive соединений. Если создавать его на запрос, каждый вызов внешнего API платит за TCP-рукопожатие и TLS, задержка растёт на десятки миллисекунд, а при нагрузке кончаются сокеты. Один клиент на приложение создают в lifespan и закрывают при остановке. httpx прекрасно работает с async, а отдельных потоков на клиента он не создаёт.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.