web-dev-qa-db-fra.com

Servir Python (Flask) REST API over HTTP2

J'ai un service Python REST et je souhaite le servir à l'aide de HTTP2. Ma configuration de serveur actuelle est nginx -> Gunicorn. En d'autres termes, nginx (port 443 et 80 qui redirige vers le port 443) fonctionne comme un proxy inverse et transmet les demandes à Gunicorn (port 8000, pas de SSL). nginx fonctionne en mode HTTP2 et je peux le vérifier en utilisant chrome et en inspectant la colonne 'protocol' après avoir envoyé un simple GET au serveur. Cependant, Gunicorn rapporte que les requêtes qu'il reçoit sont HTTP1 .0. Aussi, je ne peux pas le trouver dans cette liste: https://github.com/http2/http2-spec/wiki/Implementations Donc, mes questions sont:

  • Est-il possible de servir une application Python (Flask) avec HTTP2? Si oui, quels serveurs la prennent en charge?
  • Dans mon cas (un serveur proxy inverse et un serveur servant l'API réelle), quel serveur doit prendre en charge HTTP2?

La raison pour laquelle je veux utiliser HTTP2 est parce que dans certains cas, j'ai besoin d'effectuer des milliers de demandes ensemble et j'étais intéressé de voir si la fonction de requêtes multiplexées de HTTP2 peut accélérer les choses. Avec HTTP1.0 et Python Requêtes en tant que client, chaque demande prend environ 80 ms, ce qui est inacceptable. L'autre solution serait de simplement grouper/regrouper mes REST Oui, cette idée sonne très bien, mais je suis vraiment intéressé de voir si HTTP2 pourrait accélérer les choses.

Enfin, je dois mentionner que pour le côté client, j'utilise Python Requêtes avec l'adaptateur Hyper http2.

16
AstrOne

Est-il possible de servir une application Python (Flask) avec HTTP/2?

Oui, d'après les informations que vous fournissez, vous le faites très bien.

Dans mon cas (un serveur proxy inverse et un serveur servant l'API réelle), quel serveur doit prendre en charge HTTP2?

Maintenant, je vais marcher sur de la glace mince et donner des avis.

La façon dont HTTP/2 a été déployée jusqu'à présent est d'avoir un serveur Edge qui parle HTTP/2 (comme ShimmerCat ou NginX). Ce serveur termine TLS et HTTP/2, et à partir de là utilise HTTP/1, HTTP/1.1 ou FastCGI pour parler à l'application interne.

Un serveur Edge peut-il, au moins théoriquement, parler HTTP/2 à une application Web? Oui, mais HTTP/2 est complexe et pour les applications internes, il ne paie pas très bien.

En effet, la plupart des cadres d'application Web sont conçus pour gérer les demandes de contenu, et cela se fait assez bien avec HTTP/1 ou FastCGI. Bien qu'il y ait des exceptions, les applications Web ont peu d'utilité pour les subtilités de HTTP/2: multiplexage, priorisation, toute la myriade de précautions de sécurité, etc.

La séparation des préoccupations qui en résulte est à mon avis une bonne chose.


Votre temps de réponse de 80 ms peut avoir peu à voir avec le protocole HTTP que vous utilisez, mais si ces 80 ms sont principalement consacrés à attendre des entrées/sorties, alors bien sûr, exécuter les choses en parallèle est une bonne chose.

Gunicorn utilisera un thread ou un processus pour gérer chaque demande (sauf si vous avez fait un effort supplémentaire pour configurer le backend des greenlets), alors demandez-vous si laisser Gunicorn générer des milliers de tâches est viable dans votre cas.

Si le contenu de vos demandes le permet, vous pouvez peut-être créer des fichiers temporaires et les servir avec un serveur HTTP/2 Edge.

15
dsign

Il est maintenant possible de servir HTTP/2 directement à partir d'une application Python, par exemple en utilisant Twisted . Vous avez posé une question spécifique sur un Flask = app cependant, auquel cas je recommanderais (avec biais) Quart qui est l'API Flask réimplémentée par-dessus asyncio (avec prise en charge HTTP/2).

Votre problème réel,

Avec HTTP1.0 et Python Demandes en tant que client, chaque demande prend environ 80 ms

me suggère que le problème que vous pourriez rencontrer est que chaque demande ouvre une nouvelle connexion. Cela pourrait être atténué via l'utilisation d'un pool de connexions sans nécessiter HTTP/2.

3
pgjones