Frage

Ich versuche, einen App-Server zu skalieren, um über 20.000 Anforderungen pro Minute zu verarbeiten.

Wenn ich die Anforderungen testen, können die meisten Anfragen problemlos 20.000 U / min oder mehr behandelt werden.

, aber Anfragen, die eine externe HTTP-Anforderung (z. B. Facebook-Anmeldung) erstellen müssen, bringen Sie den Server auf eine Crawl (3.000 U / min).

Ich verstehe konzeptionell die Einschränkungen meiner aktuellen Umwelt - 3 lastabgleiche Server mit 4 Unicorn-Mitarbeitern pro Server können nur 12 Anfragen gleichzeitig umgehen, auch wenn alle auf HTTP-Anfragen warten.

Was sind meine Möglichkeiten, dies besser zu skalieren? Ich möchte viele weitere Verbindungen gleichzeitig umgehen.

Mögliche Lösungen, wie ich es verstehe:

    .
  1. rohe force: Verwenden Sie mehr Unicorn-Arbeiter (dh mehr RAM) und weitere Server.

  2. Drücken Sie alle Sperrvorgänge in Hintergrund- / Arbeitsprozesse, um die Webprozesse freizugeben. Kunden müssen regelmäßig umfragen, um zu finden, wann ihre Anfrage abgeschlossen ist.

  3. wandert an Puma anstelle von Einhorn (und wahrscheinlich zu Rubinius von MRI), so dass ich Threads anstelle von Prozessen verwenden kann - was (??) den Speicherverbrauch pro Verbindung verbessern kann, und erlauben daher die Anzahl der Arbeiter zu erhöhen.

  4. grundsätzlich, was ich suche ist: Gibt es einen besseren Weg, um die Anzahl der blockierten / Warteschlangenanfragen zu erhöhen, die ein einzelner Arbeiter damit handhaben kann, damit ich die Anzahl der Verbindungen pro Server erhöhen kann?

    Ich habe zum Beispiel die Diskussion gehört, dünn mit Eventmachine zu verwenden. Eröffnet dies die Möglichkeit eines Rails Worker, der die Webanforderung ablegen kann, an der es derzeit funktioniert (weil diese auf einem externen Server wartet) und nimmt dann eine weitere Anfrage auf, während er wartet? Wenn ja, ist dies eine lohnende Allee, um im Vergleich zu Einhorn und Puma die Leistung zu verfolgen? (Hängt es stark von den Laufzeitaktivitäten der App?)

War es hilfreich?

Lösung

Unicorn ist ein Single-Thread-Synchron-App-Server mit mehreren Prozess.Es ist kein gutes Spiel für diese Art der Verarbeitung.

es klingt, als ob Ihre Bewerbung E / A gebunden ist.Dies argumentiert für einen ereignisorientierten Daemon, um Ihre Anfragen zu verarbeiten.

Ich würde empfehlen, EventMachine und die EM-HTTP-Anfrage zu versuchen, und em-http-server .

Hier können Sie beide eingehenden Anforderungen an den HTTP-Server und den ausgehenden HTTP-Dienstaufrufen asynchron bedienen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top