Nachrichtenwarteschlange mit niedriger Latenz und großem Nachrichtenvolumen
Werde ich durch ein bisschen ein Umdenken in der groß angelegten multiplayer-Spiele im Zeitalter von Facebook-Anwendungen und cloud computing.
Nehme an, dass ich waren, etwas zu bauen auf der Oberseite des bestehenden, offenen Protokollen, und ich will zu dienen, der 1.000.000 Spieler gleichzeitig, nur um das problem Bereich.
Angenommen, jeder Spieler besitzt eine Warteschlange für eingehende Nachrichten (für chat und so weiter), und im Durchschnitt eine weitere Warteschlange für eingehende Nachrichten (Gilden-Zonen, Instanzen, Auktion, ...), so haben wir von 2.000.000 Warteschlangen. Ein Spieler wird hören, 1-10 Warteschlangen zu einer Zeit. Jede Warteschlange wird im Durchschnitt vielleicht 1 Nachricht pro Sekunde, aber bestimmte queues haben eine viel höhere rate und eine höhere Anzahl von Hörern (sagen wir, eine "Einheit Standort" Warteschlange für eine Instanz-Ebene). Nehmen wir an, nicht mehr als 100 Millisekunden von system-latency queuing, das ist OK für milde action-orientierte Spiele (aber nicht Spiele wie Quake oder Unreal Tournament).
Aus anderen Systemen, ich weiß, dass für 10.000 Benutzer auf einem einzigen 1HE-oder blade-box ist eine vernünftige Erwartung (vorausgesetzt, es gibt nichts, was teuer Los, wie der Physik-simulation oder ähnliches).
So, mit einem crossbar-cluster-system, bei dem clients eine Verbindung zu Verbindung-gateways, die wiederum eine Verbindung zu message queue Server, würden wir bekommen 10.000 Benutzer pro gateway 100-gateway Maschinen und 20.000 message queues pro queue-server mit 100-queue-Maschinen. Wieder, nur für die Allgemeine Festlegung des lösungsumfangs. Die Anzahl der verbindungen auf den einzelnen MQ-Maschine wäre winzig klein: etwa 100, zu sprechen, zu jedem der gateways. Die Anzahl der verbindungen auf den gateways wäre viel höher: 10,100 für den Kunden + die verbindungen zu allen queue-Server. (Auf der Oberseite von diesem ist, fügen Sie einige verbindungen für das Spiel world Simulations-Server oder ähnliches, aber ich bin versucht zu halten, die GESONDERT für jetzt)
Wenn ich nicht bauen wollen, das von Grund auf, ich würde verwenden einige messaging-und/oder queuing-Infrastruktur, die vorhanden ist. Die zwei offenen Protokollen, die ich finden kann, sind AMQP und XMPP. Die bestimmungsgemäße Nutzung von XMPP ist ein wenig mehr wie das, was dieses Spiel-system benötigen würde, aber der Aufwand ist deutlich spürbar (XML, plus die ausführliche Vorhandensein von Daten, sowie verschiedene andere Kanäle, die gebaut werden müssen). Das eigentliche Datenmodell von AMQP ist näher zu dem, was ich oben beschreiben, aber alle Benutzer zu sein scheinen große enterprise-Unternehmen geben, die workloads zu sein scheinen workflow-bezogene, nicht-Echtzeit-Spiel-update zusammenhängt.
Tut jedermann haben alle tagsüber Erfahrung mit diesen Technologien und Implementierungen davon, dass Sie teilen können?
InformationsquelleAutor der Frage Jon Watte | 2009-12-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
@MSalters
Re 'message queue':
RabbitMQ ist die Standard-operation ist genau das, was Sie beschreiben: transient-pubsub. Aber mit TCP anstelle von UDP.
Wenn Sie möchten, garantiert, eventuelle Liefer-und anderen Persistenz und recovery-Funktionen, dann KÖNNEN Sie das auch haben - ist es eine option. Das ist der ganze Punkt von AMQP RabbitMQ und -- kann man viele Verhaltensweisen mit nur einer Nachricht delivery system.
Dem Modell, das Sie beschreiben, ist die STANDARD-Verhalten, was vergänglich ist, "fire and forget", und die Weiterleitung von Nachrichten an, wo die Empfänger sind. Menschen verwenden RabbitMQ zu tun multicast-discovery auf EC2-nur deshalb. Erhalten Sie die UDP-geben Sie Verhaltensweisen, die über unicast-TCP-pubsub. Ordentlich, huh?
Re UDP:
Ich bin nicht sicher, ob UDP wäre hier nützlich. Wenn Sie das Gerät ausschalten Nagling dann RabbitMQ einzelne Nachricht roundtrip-Latenz (client-broker-client) wurde gemessen bei 250 bis 300 Mikrosekunden. Hier finden Sie einen Vergleich mit Windows-Latenz (das war ein bisschen höher) http://old.nabble.com/High%28er%29-latency-with-1.5.1--p21663105.html
Ich kann nicht denken, der viele multiplayer-Spiele, die müssen roundtrip-Latenz geringer als 300 Mikrosekunden. Sie könnte unter 300us mit TCP. TCP-windowing ist teurer als raw UDP, aber wenn Sie UDP verwenden, um schneller zu gehen, und fügen Sie eine benutzerdefinierte Verlust-recovery oder seqno/ack/senden-manager dann können Sie langsam wieder nach unten. Es hängt alles von Ihren Anwendungsfall. Wenn Sie wirklich, wirklich, wirklich brauchen, um die UDP-und lazy-Bestätigungen und so weiter, dann könnte man die Streifen aus RabbitMQ TCP und wahrscheinlich durchziehen.
Ich hoffe, das hilft klären, warum ich empfohlen, RabbitMQ für Jon ' s Anwendungsfall.
InformationsquelleAutor der Antwort alexis
Baue ich so ein system jetzt tatsächlich.
Ich habe eine ganze Menge Auswertung mehrerer MQs, einschließlich RabbitMQ, Qpid, und ZeroMQ. Die Latenz und der Durchsatz dieser sind mehr als ausreichend für diese Art von Anwendung. Was nicht gut ist, jedoch ist die Warteschlange Schöpfung mal in der Mitte von einer halben million Warteschlangen oder mehr. Qpid insbesondere vermindert Sie sehr stark nach ein paar tausend Warteschlangen. Um zu umgehen dieses problem, Sie haben in der Regel erstellen Sie Ihre eigenen routing-Mechanismen (kleinere Anzahl von Warteschlangen und die Verbraucher auf die Warteschlangen sind immer Nachrichten, die Sie nicht haben ein Interesse in).
Meinem aktuellen system wahrscheinlich nutzen, ZeroMQ, aber in einem relativ begrenzten Weise innen cluster. Verbindungen von clients verarbeitet werden, der mit einem custom-sim. daemon, die ich gebaut mit libev und ist komplett single-threaded (und zeigt sehr gute Skalierung-es sollte in der Lage sein zu handhaben als 50.000 verbindungen auf einer box ohne irgendwelche Probleme-unsere sim-Karte. tick-rate ist ziemlich niedrig, aber, und es gibt keine Physik).
XML (und somit auch XMPP) ist sehr viel nicht geeignet, um diese, wie Sie peg die CPU die Verarbeitung der XML-lange bevor Sie gebunden werden auf der I/O -, das ist nicht, was Sie wollen. Wir sind mit Google Protocol Buffers, in dem moment, und die scheinen gut geeignet, um unsere Bedürfnisse zu finden. Wir sind auch über das TCP-Protokoll für die client-verbindungen. Ich habe Erfahrung mit der Verwendung von UDP und TCP für die dies in der Vergangenheit, und wie von anderen darauf hingewiesen -, UDP-hat einige Vorteile, aber es ist ein wenig schwieriger, mit zu arbeiten.
Hoffentlich, wenn wir ein wenig näher, um zu starten, ich werde in der Lage sein, um mehr details mitteilen.
InformationsquelleAutor der Antwort Tim McClarren
Jon, das klingt wie ein Idealer Anwendungsfall für AMQP und RabbitMQ.
Ich bin nicht sicher, warum Sie sagen, dass AMQP-Benutzer sind alle großen enterprise-Unternehmen geben. Mehr als die Hälfte unserer Kunden sind in den " web " - Raum reichen von großen zu kleinen Unternehmen. Viele Spiele, Wetten-Systeme, chat-Systeme, twittery-Typ-Systeme und cloud-computing-infras erstellt wurden von RabbitMQ. Es gibt sogar Handy-Anwendungen. Workflows sind nur einer von vielen Anwendungsfällen.
Versuchen wir zu verfolgen, was hier Los ist:
http://www.rabbitmq.com/how.html (stellen Sie sicher, dass Sie durch klicken auf die Listen der use cases auf del.icio.uns auch!)
Bitte werfen Sie einen Blick. Wir sind hier um zu helfen. Fühlen Sie sich frei, um uns per E-Mail [email protected] oder schlagen Sie mir auf twitter (@monadischen).
InformationsquelleAutor der Antwort alexis
FWIW, für Fälle, in denen die Zwischenergebnisse sind nicht wichtig (wie Positionierung info) Qpid hat eine "last-value-queue", die liefern nur den aktuellen Wert an einen Abonnenten.
InformationsquelleAutor der Antwort Steve Huston
Meine Erfahrung war mit einem nicht-offenen alternativen, BizTalk. Die schmerzhafte Lektion, die wir gelernt ist, dass diese komplexen Systeme sind NICHT schnell. Und als man dachte, von den hardware Anforderungen, das übersetzt sich direkt in hohe Kosten.
Deshalb, don ' T sogar gehen in der Nähe von XML für die Kern-Schnittstellen. Ihre server-cluster Analyse 2 Millionen Nachrichten pro Sekunde. Das könnte leicht sein, 2-20 GB/sec von XML! Jedoch, die meisten Nachrichten werden für ein paar Warteschlangen, während die meisten Schlangen sind in der Tat low-traffic.
Daher, entwerfen Sie Ihre Architektur, so dass es leicht zu starten mit BABYBETT-queue-Server und verschieben Sie dann jede queue (type), um ein custom-queue-server, wenn ein Engpass identifiziert.
Ebenfalls, aus ähnlichen Gründen, nicht davon ausgehen, dass eine message-queue-Architektur ist das beste für alle comminication Bedürfnisse Ihrer Anwendung hat. Nehmen Sie Ihre "Einheit Standort in einer Instanz" - Beispiel. Dies ist ein klassischer Fall, wo Sie nicht wollen die garantierte Zustellung von Nachrichten. Der Grund, dass Sie brauchen, um diese Informationen zu teilen ist, weil es ändert sich die ganze Zeit. Also, wenn eine Nachricht verloren geht, die Sie nicht wollen, Zeit zu verbringen, ihn wiederherzustellen. Sie würde nur senden Sie die alten locatiom der betroffenen Person. Stattdessen werden Sie wollen, um zu senden, die aktuellen Position der Entität. Technologie-Weise bedeutet dies, dass Sie wollen, UDP, nicht TCP und ein custom-Verlust-recovery-Mechanismus.
InformationsquelleAutor der Antwort MSalters