Meine eigentliche Frage ist, kann der obige Tech-Stack 1.000.000 Nachrichten pro Sekunde (Text, Bilder, Videos) skalieren?
Sicher kann es. Mit dem richtigen Design und genügend Hardware. Die Frage, die sich Ihr Kunde stellen sollte, ist wirklich nicht, ob es möglich ist, so groß zu werden, sondern zu welchen Kosten und Praktikabilität es möglich ist und ob dies die beste Wahl ist.
Sehen wir uns die einzelnen Teile an, die Sie erwähnt haben:
node.js - Für eine E/A-zentrierte Anwendung ist sie eine ausgezeichnete Wahl für hohe Skalierung und kann durch die Bereitstellung vieler CPUs in einem Cluster (sowohl mit mehreren Prozessen pro Server als auch mit mehreren Servern) skaliert werden. Wie praktisch diese Art der Skalierung ist, hängt stark davon ab, auf welche Art von gemeinsamen Daten all diese Serverprozesse Zugriff benötigen. Normalerweise stellt der Datenspeicher letztendlich den schwierigeren Engpass bei der Skalierung dar, da es einfach ist, mehr Server für die Anforderungsverarbeitung einzusetzen. Es ist nicht so einfach, mehr Hardware auf einen zentralen Datenspeicher zu werfen. Es gibt Möglichkeiten, dies zu tun, aber es hängt stark von den Anforderungen der App ab, wie Sie es tun und wie schwer es ist.
socket.io - Wenn Sie einen effizienten Server-Push für kleinere Nachrichten benötigen, ist socket.io wahrscheinlich der beste Weg, da es am effizientesten beim Pushen an den Client ist. Es ist jedoch nicht bei allen Transportarten großartig. Zum Beispiel würde ich keine großen Bilder oder Videos über socket.io verschieben, da es dafür mehr zweckgebundene Möglichkeiten gibt. Die Verwendung von socket.io hängt also stark davon ab, wofür die App es genau verwenden möchte. Wenn Sie ein Video an einen Client senden möchten, können Sie auch nur eine URL senden und den Client umdrehen und das Video über eine normale http-URL mit bekannter High-Scale-Technologie anfordern.
Redis - Nochmals, großartig für einige Dinge, nicht großartig für alles. Also, es hängt wirklich davon ab, was Sie versuchen zu tun. Was ich zuvor erklärt habe, ist, dass das Design Ihres Datenspeichers und die Anzahl der Transaktionen darin wahrscheinlich Ihre wahren Skalierungsprobleme sind. Wenn ich diesen Job anfangen würde, würde ich mit einem Verständnis der Datenspeicheranforderungen für einen Server, Transaktionen pro Sekunde verschiedener Art, Caching-Strategie, Redundanz, Failover, Datenpersistenz usw. beginnen und das High entwerfen zuerst den Zugriff auf Daten skalieren. Ich wäre mir nicht ganz sicher, ob Redis die bevorzugte Wahl war. Ich würde wahrscheinlich vorschlagen, dass Sie zu Beginn des Projekts einen erfahrenen Datenbankspezialisten als Berater benötigen.
Nginx - Viele hochskalierte Websites verwenden nginx, daher ist es sicherlich ein gutes Tool. Ob es genau das richtige Werkzeug für Sie ist, hängt von Ihrem Design ab. Ich würde wahrscheinlich zuletzt an diesem Teil arbeiten, weil er weniger zentral für das Design zu sein scheint und sobald der Rest des Systems ausgelegt ist, können Sie überlegen, was Sie hier brauchen.
Amazon EC2 - Eine von mehreren möglichen Optionen. Diese Entscheidungen sind schwer direkt in einem Äpfel-zu-Äpfel-Vergleich zu vergleichen. Groß angelegte Systeme wurden aus EC2 aufgebaut, daher gibt es dort einen Proof of Concept und die allgemeine Architektur scheint angemessen zu sein. Wenn Sie wissen wollten, wo die echten Gremlins sind, brauchen Sie einen Berater, der umfangreiche Sachen auf EC2 gemacht hat.
Amazon S3 - Ich persönlich kenne einige Websites mit sehr hohem Speicherplatz und hoher Bandbreite, die S3 sowohl für Videos als auch für Bilder verwenden. Dafür funktioniert es.
Also ... dies sind im Allgemeinen wahrscheinlich gute Werkzeuge, wenn sie richtig verwendet werden. Redis wäre ein Fragezeichen, abhängig von den Speicheranforderungen der tatsächlichen Anwendung (Sie haben null Anforderungen angegeben und eine Datenbank kann nicht mit null Anforderungen ausgewählt werden). Eine vernünftigere Antwort würde darauf beruhen, eine Reihe von Anforderungen auf hoher Ebene zusammenzustellen, die analysieren, was das System leisten muss, um 1.000.000 was auch immer zu bedienen. Diese Anforderungen könnten mit bekannten Fähigkeiten für einige dieser Teile verglichen werden, um einen Anhaltspunkt für die Skalierung eines Systems zu geben. Dann müssten Sie einige Benchmarking-Tests zusammenstellen, um einige Tests auf bestimmten Teilen des Systems durchzuführen. Der Erfolg eines Misserfolgs würde ebenso stark davon abhängen, wie die App erstellt und wie die Tools verwendet wurden, als auch, welche Tools ausgewählt wurden. Sie können wahrscheinlich mit vielen verschiedenen Arten von Tools eine erfolgreiche Waage erstellen. Verdammt, Facebook läuft auf PHP (na ja, einem stark modifizierten, angepassten PHP, das zur Laufzeit überhaupt nicht wirklich typisches PHP ist).