Comment faire des demandes HTTP dans des rails tout en conservant de nombreuses demandes par minute?
-
21-12-2019 - |
Question
J'essaie d'accabler un serveur d'applications pour traiter plus de 20 000 demandes par minute.
Lorsque je recherche, testez les demandes, la plupart des demandes traitent facilement 20 000 tr / min.
mais, les demandes qui doivent apporter une demande HTTP externe (par exemple, la connexion Facebook) apportent le serveur à un crawl (3 000 tr / min).
Je comprends conceptuellement les limitations de mon environnement actuel - 3 serveurs de charge équilibrés avec 4 travailleurs de la licorne par serveur ne peuvent gérer que 12 demandes à la fois, même si elles attendent toutes les demandes HTTP.
Quelles sont mes options pour améliorer cela mieux? Je voudrais gérer beaucoup plus de connexions à la fois.
solutions possibles comme je le comprends:
-
force brute: utilisez plus de travailleurs de la licorne (c.-à-d. Plus de RAM) et plus de serveurs.
-
poussez toutes les opérations de blocage dans les processus de fond / travailleur pour libérer les processus Web. Les clients devront sonder périodiquement pour trouver lorsque leur demande est terminée.
-
passer à PUMA au lieu de la licorne (et probablement à Rubinius d'IRM), de sorte que je puisse utiliser des threads au lieu de processus - qui peuvent (??) améliorer l'utilisation de la mémoire par connexion et permettre au nombre de les travailleurs à augmenter.
Fondamentalement, ce que je cherche, c'est que: Y a-t-il un meilleur moyen d'augmenter le nombre de demandes bloquées / filequeuses qu'un seul travailleur peut gérer afin d'augmenter le nombre de connexions par serveur?
Par exemple, j'ai entendu parler de l'utilisation de minces avec EventMachine. Cela ouvre-t-il la possibilité d'un travailleur de rails pouvant poser la demande sur le Web qu'il fonctionne actuellement (car celui-ci attend sur un serveur externe), puis choisit une autre demande alors qu'elle attend? Si oui, est-ce une avenue intéressante à poursuivre pour la performance par rapport à la Licorne et à Puma? (Cela dépend-il fortement des activités d'exécution de l'application?)
La solution
Unicorn est un serveur d'applications synchrone à plusieurs procédés multi-processus.Ce n'est pas un bon match pour ce genre de traitement.
On dirait que votre application est I / O liée.Cela fait valoir un démon orienté vers l'événement pour traiter vos demandes.
Je recommanderais d'essayer EventMachine et la demande EM-HTTP et EM-http-serveur .