Comment faire des demandes HTTP dans des rails tout en conservant de nombreuses demandes par minute?

StackOverflow https://stackoverflow.com//questions/22029333

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:

  1. force brute: utilisez plus de travailleurs de la licorne (c.-à-d. Plus de RAM) et plus de serveurs.

  2. 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.

  3. 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.

  4. 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?)

Était-ce utile?

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 .

Cela vous permettra de servir les deux demandes entrantes au serveur HTTP et aux appels de service HTTP sortants de manière asynchrone.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top