6 votes

fastcgi multiplexage ?

Je suis en train d'implémenter une application fastcgi, et après avoir lu les spécifications de fastCGI, j'ai trouvé une fonctionnalité appelée "multiplexage des requêtes". Cela m'a rappelé le multiplexage RTMP d'Adobe à l'époque où ce protocole était propriétaire et fermé.

D'après ce que j'ai compris, le multiplexage permet de réduire la charge de travail liée à la création de nouvelles connexions avec les clients FCGI, en imbriquant efficacement les morceaux de demandes, et en permettant en même temps le modèle "keep-alive" à la connexion. Le dernier permet d'envoyer plusieurs demandes sur une seule connexion.

La première question est de savoir si j'ai bien compris.

La prochaine est - après quelques recherches sur Google, j'ai découvert qu'il n'y a pas de serveur qui implémente le multiplexage FCGI, j'étais intéressé par les serveurs "populaires" en premier lieu, je veux dire nginx et lighttpd. J'ai même trouvé des discussions sur la dépréciation du multiplexage des requêtes FCGI.

La question est donc la suivante : existe-t-il un serveur qui prenne en charge cette fonctionnalité ?

2voto

Matthias Points 770

Q : Le multiplexage permet de réduire la charge de travail liée à la création de nouvelles connexions avec les clients FCGI, grâce à l'entrecroisement des requêtes.

R : C'est vrai. Mais le keep-alive réduit également les nouvelles connexions.

Q : et en même temps activer le modèle "keep-alive" pour la connexion

R : Le multiplexage n'est pas nécessaire pour la fonction "keep-alive".

Q : Latter permet d'envoyer plusieurs requêtes sur une seule connexion.

R : la fonction "keep-alive" permet d'effectuer plusieurs demandes l'une après l'autre. Le multiplexage permet d'effectuer plusieurs demandes en parallèle.

Il n'existe pas de serveur web FastCGI largement répandu qui prenne en charge le multiplexage. Mais nginx supporte FastCGI keep-alive.

Le multiplexage FastCGI est généralement une mauvaise idée, car FastCGI ne prend pas en charge le contrôle de flux. Cela signifie que : Si un backend FastCGI envoie des données, mais que le client http ne peut pas les recevoir assez rapidement, le serveur web doit sauvegarder toutes ces données, jusqu'à ce qu'elles puissent être envoyées au client.

Si le multiplexage n'est pas utilisé, le serveur web peut simplement ne pas lire les données du serveur fastcgi si le client http est trop lent, ce qui a pour effet d'engorger le serveur fastcgi. Avec le multiplexage, le serveur web doit lire toutes les données du serveur fastcgi, même si l'un des clients ne reçoit pas les données assez rapidement.

2voto

sebres Points 498

J'essaie d'énoncer les réponses ci-dessus de manière plus précise (et de corriger certaines parties)...

le multiplexage permet de réduire la charge de travail liée à la création de nouvelles connexions avec les clients FCGI en imbriquant efficacement les morceaux de demandes

Contrairement au keep-alive, il réduit considérablement les nouvelles connexions, en particulier sur les serveurs à forte charge ou en cas d'utilisation de micro-services (beaucoup de micro-requêtes). En outre, il est presque nécessaire dans le cas d'un équilibrage à travers le réseau (on ne peut donc plus utiliser les sockets unix et le processus d'établissement des connexions devient de plus en plus prioritaire).

et en même temps d'activer le modèle "keep-alive" pour la connexion

Bien que le multiplexage ne soit pas nécessaire pour le keep-alive, le keep-alive est presque nécessaire pour le multiplexage (sinon cela n'aurait pas de sens).

J'ai constaté qu'il n'y a pas de serveur qui mette en œuvre le multiplexage FCGI.

Il existe peu de serveurs qui prennent en charge le multiplexage dès le départ, mais...
J'ai déjà vu plusieurs modules d'autres développeurs et j'ai mon propre module fcgi pour nginx (en remplacement) qui supporte les requêtes multiplex FastCGI. Il peut montrer l'augmentation réelle des performances dans la pratique, en particulier si les flux en amont sont connectés sur le réseau. Si quelqu'un en a besoin, j'essaierai de trouver le temps de le rendre disponible sur github, etc.

[ de la réponse ci-dessus ] Le multiplexage FastCGI est généralement une mauvaise idée, car FastCGI ne prend pas en charge le contrôle de flux. Cela signifie que : Si un backend FastCGI envoie des données, mais que le client http ne peut pas les recevoir assez rapidement, le serveur web doit sauvegarder toutes ces données, jusqu'à ce qu'elles puissent être envoyées au client.

Ce n'est pas le cas. Normalement, les gestionnaires FastCGI sont entièrement asynchrones, le pool de travailleurs est séparé des travailleurs chargés de la livraison, etc. Ainsi, chaque morceau reçoit un identifiant de requête, de sorte que si deux ou plusieurs travailleurs en amont écrivent simultanément sur une seule connexion, les morceaux que nginx obtiendra seront simplement plus petits. C'est ce que l'on appelle le contre unique. En ce qui concerne la question "le serveur web doit sauvegarder toutes ces données", il le fait dans tous les cas (que le multiplexage soit utilisé ou non), car sinon on peut se retrouver dans une situation de mémoire saturée s'il y a trop de données en attente disponibles pour la réponse. Ainsi, soit le backend doit produire moins de données (ou être contrecarré), soit le serveur web doit les recevoir dès que possible et les transmettre au client ou les sauvegarder dans un stockage intermédiaire (et par exemple, nginx le fait si la taille des données en attente dépasse les valeurs configurées avec taille_du_tampon_de_cgi y fastcgi_buffers ).

[ de la réponse ci-dessus Lors de l'utilisation du multiplexage, le serveur web doit lire toutes les données du backend fastcgi, même si l'un des clients ne reçoit pas les données assez rapidement.

C'est également faux. Le serveur web ne doit lire qu'un seul morceau de réponse jusqu'à la fin, et les bons groupes de travail ont une gestion "intelligente" qui envoie automatiquement les morceaux au serveur web dès que possible (c'est-à-dire s'ils sont disponibles). Ainsi, si plusieurs fournisseurs de contenu écrivent sur des canaux dits "réfléchis" de la même connexion réelle, les paquets en attente seront séparés et les morceaux seront reçus de nginx dès que les données de réponse seront disponibles. Ainsi, seul le débit de la connexion est déterminant, et la vitesse à laquelle les clients recevront les données n'a aucune importance. Une fois encore, le multiplexage permet d'économiser considérablement le temps nécessaire à l'établissement de la connexion, ce qui réduit le nombre de demandes en attente ainsi que le temps d'exécution de la demande commune (taux de transaction).

0voto

Basile Starynkevitch Points 67055

Je ne sais pas si certains serveurs implémentent le multiplexage FASTCGI (que je crois que vous avez compris correctement, mais les détails se trouvent dans les spécifications du protocole FASTCTI), et je ne m'en préoccuperais pas.

Vous utiliserez très probablement FASTCGI par l'intermédiaire d'un bibliothèque FASTCGI existante (par exemple Ocamlnet si vous codez en Ocaml, etc.) Et cette bibliothèque ferait le multiplexage, si elle le fait. De votre point de vue (celui de l'utilisateur de cette bibliothèque), vous ne devriez pas vraiment vous en préoccuper, à moins que vous ne codiez vous-même une telle bibliothèque.

Si le multiplexage FASTCGI vous gêne, vous pouvez utiliser la commande SCGI qui offre des fonctionnalités similaires, mais qui est plus simple, un peu moins efficace et non multiplexé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X