REST API обслуживающего Python (Flask) через HTTP2

У меня есть служба Python REST, и я хочу обслуживать ее, используя HTTP2. Моя текущая настройка сервераnginx -> Gunicorn, Другими словами, nginx (порт 443 и 80, который перенаправляет на порт 443) работает в качестве обратного прокси-сервера и перенаправляет запросы в Gunicorn (порт 8000, без SSL). nginx работает в режиме HTTP2, и я могу убедиться в этом, используя chrome и проверяя столбец 'protocol' после отправки простого GET на сервер. Тем не менее, Gunicorn сообщает, что получает запросы HTTP1.0. Кроме того, я не могу найти его в этом списке:https://github.com/http2/http2-spec/wiki/Implementations Итак, мои вопросы:

Можно ли обслуживать приложение Python (Flask) с HTTP2? Если да, то какие серверы его поддерживают?В моем случае (один обратный прокси-сервер и один, обслуживающий реальный API), какой сервер должен поддерживать HTTP2?

Причина, по которой я хочу использовать HTTP2, заключается в том, что в некоторых случаях мне нужно выполнять тысячи запросов все вместе, и мне было интересно посмотреть, может ли функция мультиплексированных запросов HTTP2 ускорить процесс. С HTTP1.0 и Python Requests в качестве клиента каждый запрос занимает ~ 80 мс, что недопустимо. Другое решение состоит в том, чтобы просто группировать / группировать мои REST-ресурсы и отправлять несколько с помощью одного запроса. Да, эта идея звучит просто отлично, но мне действительно интересно посмотреть, сможет ли HTTP2 ускорить процесс.

Наконец, я должен отметить, что для клиентской части я использую Python Requests с адаптером Hyper http2.

Ответы на вопрос(2)

например, используяскрученный, Вы спросили конкретно о приложении Flask, но в этом случае я бы (с уклоном) порекомендовалкварта это Flask API, переопределяемый поверх asyncio (с поддержкой HTTP / 2).

Ваша актуальная проблема,

С HTTP1.0 и Python Requests в качестве клиента каждый запрос занимает ~ 80 мс

предполагает, что проблема, с которой вы можете столкнуться, заключается в том, что каждый запрос открывает новое соединение. Это может быть облегчено с помощьюпул соединений не требуя HTTP / 2.

Решение Вопроса

Да, по информации, которую вы предоставляете, у вас все хорошо.

В моем случае (один обратный прокси-сервер и один, обслуживающий реальный API), какой сервер должен поддерживать HTTP2?

Теперь я собираюсь наступить на тонкий лед и высказать свое мнение.

До сих пор HTTP / 2 был развернут с помощью пограничного сервера, который поддерживает HTTP / 2 (например, ShimmerCat или NginX). Этот сервер завершает TLS и HTTP / 2, и оттуда использует HTTP / 1, HTTP / 1.1 или FastCGI для связи с внутренним приложением.

Может ли хотя бы теоретически пограничный сервер взаимодействовать с HTTP / 2 с веб-приложением? Да, но HTTP / 2 сложен и для внутренних приложений не очень хорошо окупается.

Это связано с тем, что большинство фреймворков для веб-приложений созданы для обработки запросов на контент, и это делается достаточно хорошо с HTTP / 1 или FastCGI. Хотя есть исключения, веб-приложения мало используют для тонкостей HTTP / 2: мультиплексирование, расстановка приоритетов, все множество мер безопасности и так далее.

Получившееся разделение интересов, на мой взгляд, хорошо.

Ваше время отклика 80 мс может иметь мало общего с используемым протоколом HTTP, но если эти 80 мс в основном тратятся на ожидание ввода / вывода, то, конечно, параллельная работа - это хорошо.

Gunicorn будет использовать поток или процесс для обработки каждого запроса (если вы не потратили лишнюю милю на настройку бэкэнда greenlets), поэтому подумайте, возможно ли позволить Gunicorn порождать тысячи задач в вашем случае.

Если содержание ваших запросов позволяет, возможно, вы можете создавать временные файлы и обслуживать их с помощью пограничного сервера HTTP / 2.

Ваш ответ на вопрос