Kurz gesagt: Sie sollten in der Lage sein, in der Größenordnung von Millionen gleichzeitig aktiver TCP-Verbindungen und durch Erweiterung HTTP-Anforderungen zu erreichen. Dies zeigt Ihnen die maximale Leistung, die Sie mit der richtigen Plattform mit der richtigen Konfiguration erwarten können.
Heute war ich besorgt, ob IIS mit ASP.NET in der Größenordnung von 100 gleichzeitigen Verbindungen unterstützt (siehe mein Update, erwarte ~ 10.000 Antworten pro Sekunde bei älteren ASP.Net Mono-Versionen). Als ich diese Frage / Antworten sah, konnte ich nicht widerstehen, mir selbst zu antworten. Viele Antworten auf die Frage hier sind völlig falsch.
I'm besten fall
Die Antwort auf diese Frage muss sich nur mit der einfachsten Serverkonfiguration befassen, um sich von den unzähligen Variablen und Konfigurationen zu entkoppeln, die nachgeschaltet möglich sind.
Betrachten Sie also das folgende Szenario für meine Antwort:
- Kein Datenverkehr in den TCP-Sitzungen, außer für Keep-Alive-Pakete (andernfalls würden Sie offensichtlich eine entsprechende Menge an Netzwerkbandbreite und anderen Computerressourcen benötigen).
- Software, die für die Verwendung von asynchronen Sockets und Programmierungen anstelle eines Hardware-Threads pro Anforderung aus einem Pool entwickelt wurde. (dh IIS, Node.js, Nginx ... Webserver [aber nicht Apache] mit asynchron gestalteter Anwendungssoftware)
- Gute Leistung / Dollar CPU / Ram. Sagen wir heute willkürlich i7 (4 Core) mit 8 GB RAM.
- Eine gute passende Firewall / Router.
- Kein virtuelles Limit / Governor - dh. Linux somaxconn, IIS web.config ...
- Keine Abhängigkeit von anderer langsamerer Hardware - kein Lesen von der Festplatte, da dies der kleinste gemeinsame Nenner und Engpass wäre, nicht die Netzwerk-E / A.
Detaillierte Antwort
Synchrone Thread-gebundene Designs weisen im Vergleich zu asynchronen E / A-Implementierungen tendenziell die schlechteste Leistung auf.
WhatsApp erhält eine Million WITH-Traffic auf einem einzelnen Unix-Betriebssystem - https://blog.whatsapp.com/index.php/2012/01/1-million-is-so-2011/ .
Und schließlich geht dieser, http://highscalability.com/blog/2013/5/13/the-secret-to-10-million-concurrent-connections-the-kernel-i.html , auf viele Details ein und erkundete, wie sogar 10 Millionen erreicht werden könnten. Server verfügen häufig über Hardware-TCP-Offload-Engines, ASICs, die für diese spezielle Rolle effizienter entwickelt wurden als eine Allzweck-CPU.
Gute Auswahl an Software-Designs
Das asynchrone E / A-Design unterscheidet sich zwischen Betriebssystemen und Programmierplattformen. Node.js wurde asynchron entwickelt. Sie sollten mindestens Promises verwenden, und wenn ECMAScript 7 verfügbar ist, async
/ await
. C # /. Net bietet bereits vollständige asynchrone Unterstützung wie node.js. Unabhängig vom Betriebssystem und der Plattform sollte eine sehr gute asynchrone Leistung erwartet werden. Und egal für welche Sprache Sie sich entscheiden, suchen Sie nach dem Schlüsselwort "asynchron". Die meisten modernen Sprachen werden unterstützt, auch wenn es sich um ein Add-On handelt.
Zu WebFarm?
Unabhängig von der Grenze für Ihre spezielle Situation ist eine Webfarm eine gute Lösung für die Skalierung. Es gibt viele Architekturen, um dies zu erreichen. Einer verwendet einen Load Balancer (Hosting-Anbieter können diese anbieten, aber selbst diese haben ein Limit, zusammen mit der Bandbreitenobergrenze), aber ich bevorzuge diese Option nicht. Für Einzelseitenanwendungen mit lang laufenden Verbindungen bevorzuge ich stattdessen eine offene Liste von Servern, aus denen die Clientanwendung beim Start zufällig auswählt und über die Lebensdauer der Anwendung wiederverwendet. Dies beseitigt den Single Point of Failure (Load Balancer) und ermöglicht die Skalierung durch mehrere Rechenzentren und damit viel mehr Bandbreite.
Einen Mythos zerstören - 64K-Ports
Dies ist ein Missverständnis, um die Fragekomponente bezüglich "64.000" anzusprechen. Ein Server kann eine Verbindung zu mehr als 65535 Clients herstellen. Siehe /networkengineering/48283/is-a-tcp-server-limited-to-65535-clients/48284
Übrigens erlaubt Http.sys unter Windows mehreren Anwendungen, denselben Serverport unter dem HTTP-URL-Schema gemeinsam zu nutzen. Sie registrieren jeweils eine separate Domänenbindung, aber letztendlich gibt es eine einzelne Serveranwendung, die die Anforderungen an die richtigen Anwendungen weiterleitet.
Update 2019-05-30
Hier ist ein aktueller Vergleich der schnellsten HTTP-Bibliotheken - https://www.techempower.com/benchmarks/#section=data-r16&hw=ph&test=plaintext
- Testdatum: 2018-06-06
- Verwendete Hardware: Dell R440 Xeon Gold + 10 GbE
- Der Leiter hat ~ 7 Millionen Klartextantworten pro Sekunde (Antworten keine Verbindungen)
- Das zweite Fasthttp für Golang kündigt 1,5 Millionen gleichzeitige Verbindungen an - siehe https://github.com/valyala/fasthttp
- Die führenden Sprachen sind Rust, Go, C ++, Java, C und sogar C # mit 11 (6,9 Millionen pro Sekunde). Scala und Clojure rangieren weiter unten. Python belegt mit 2,7 Millionen pro Sekunde den 29. Platz.
- Am Ende der Liste stelle ich Laravel und Cakephp, Rails, Aspnet-Mono-Ngx, Symfony, Zend fest. Alles unter 10.000 pro Sekunde. Beachten Sie, dass die meisten dieser Frameworks für dynamische Seiten erstellt wurden und ziemlich alt sind. Möglicherweise gibt es neuere Varianten, die weiter oben in der Liste aufgeführt sind.
- Denken Sie daran, dass dies HTTP-Klartext ist, nicht für die Websocket-Spezialität: Viele Leute, die hierher kommen, werden wahrscheinlich an gleichzeitigen Verbindungen für Websocket interessiert sein.