Serverseitige Architektur für Online-Spiele

7

Grundsätzlich habe ich einen Spieleclient, der für fast jede Aktion mit einem Server kommuniziert. Das Spiel ist in Java (mit LWJGL) und jetzt werde ich mit der Erstellung des Servers beginnen.

Die Basis des Spiels ist normalerweise ein Client, der nur mit dem Server kommuniziert. Später müssen jedoch mehrere Clients für einige Funktionen zusammenarbeiten.

Ich habe bereits gelesen, wie der Authentifizierungsserver getrennt werden soll, und ich beabsichtige, dies zu tun. Das Problem ist, dass ich mit dieser Art der serverseitigen Programmierung völlig unerfahren bin. Alles, was ich jemals programmiert habe, waren JSF-Webanwendungen.

Ich kann mir vorstellen, dass ich für so ziemlich jede Spielekommunikation Socket-Verbindungen herstellen werde, da HTML sehr langsam ist, aber ich weiß immer noch nicht, wo ich auf meinem Server anfangen soll.

Ich würde gerne Material oder Richtlinien lesen, wo ich anfangen soll, welche Architektur der Spieleserver haben sollte und vielleicht einige Vorschläge zu Frameworks, die mir helfen könnten, die Client-Server-Kommunikation herzustellen.

Ich habe mich mit JNAG befasst, aber ich habe keine Erfahrung mit solchen Dingen, daher kann ich nicht wirklich sagen, ob es sich um eine solide und gute Messaging-Ebene handelt.

Jede Hilfe wird geschätzt ... Danke!

BEARBEITEN:

Nur ein bisschen mehr Informationen über das Spiel. Es soll ein sehr komplexes Spiel mit mehreren Funktionen sein, wodurch einige Funktionen zu einem "Programm" innerhalb des Programms werden. Es ist kein gewöhnliches Spiel wie FPS oder RPG, aber ich beabsichtige, dass viele Benutzer diese vielen verschiedenen "Programme" im Spiel verwenden.

Wenn ich nicht klar genug wäre, würde ich Leute wirklich schätzen, die bereits Spiele mit Java-Client / Server-Architektur entwickelt haben, wie sie kommuniziert haben, Frameworks, APIs, Messaging-Systeme usw.

Es ist keine Frage mangelnder Sprachkenntnisse, sondern eher eine Frage des Ratschlags, damit ich nicht etwas erschaffe, das funktioniert, sondern in späteren Phasen aus irgendeinem einschränkenden Grund neu geschrieben werden muss. PS: Entschuldigung, wenn mein Englisch nicht perfekt ist ...

Draiken
quelle
1
Die Multiverse-Server sind, soweit Sie sich erinnern, in Java geschrieben, aber es hört sich so an, als hätten Sie bereits ein Spiel. Trotzdem gibt es eine schöne Übersicht auf hoher Ebene, die Sie hier ansehen
DrDeth
Während Ihre Spielserver-Architektur vom Spiel im Allgemeinen definiert wird. Es ist sehr plattform- und genreabhängig. Wenn Sie für viele Benutzer planen, ist Java eine gute Gelegenheit, Amazon [Elastic Beanstalk] [1] zu nutzen. Dies ist eine großartige Möglichkeit, Ihren Server bei Bedarf zu skalieren. Vielleicht sollten Sie uns mehr über das Spiel erzählen - JNAG könnte mehr sein, als Sie brauchen, dh. in einem rundenbasierten Spiel mit maximal 4 Spielern. [1]: aws.amazon.com/elasticbeanstalk
Konrad K.

Antworten:

12

Leider sind mir keine (guten) Online-Ressourcen oder Bücher zu diesem Thema bekannt. Und ich kenne Java nicht. Da es jedoch noch keine Antworten gibt, werde ich einige Tipps aus persönlicher Erfahrung geben.

Zunächst benötigen Sie einen schnellen und zuverlässigen RPC- oder zumindest Nachrichtenwarteschlangenmechanismus. Dies soll sowohl für die Client-Server- als auch für die Server-Server-Kommunikation verwendet werden. Ich weiß nicht, ob es fertige Lösungen für Java gibt. Mit .NET haben wir immer unsere eigene erstellt, da dieser Mechanismus wirklich wichtig ist. Am häufigsten wird ein leichtes binäres Nachrichtenprotokoll über TCP verwendet, andere Optionen können jedoch je nach Spieltyp besser sein. Eine rundenbasierte Strategie ist mit XML oder SOAP möglicherweise besser, und ein schneller Shooter kann UDP rechtfertigen.

Das absolute Minimum für Messaging-Systeme ist die Fähigkeit, Remote-Aktionen zuverlässig aufzurufen und gleichzeitig deren Reihenfolge zu gewährleisten . Eine wirklich hilfreiche Ergänzung ist die Unterstützung des Anforderungs- / Antwortmusters, bei dem eine Remote-Aktion möglicherweise ein Ergebnis an ihren Initiator zurückgibt. Dies ist nicht erforderlich, kann aber Ihr Leben viel einfacher machen.

Denken Sie nach dem Teilen Ihrer Nachrichten an die Partitionierung Ihres Servers. Höchstwahrscheinlich reicht ein einziger Server nicht aus, um das Spiel für alle Spieler zu hosten. Sie müssen sorgfältig überlegen, welche Aufgaben unabhängig voneinander sein und somit an verschiedene Server delegiert werden können. Authentifizierung und Anmeldung sind der offensichtlichste Kandidat für diese Partitionierung. Unter anderem sind Statistik- und Bewertungsberechnungen, Datenbankkommunikation (ein Server, der einen speziellen DB-Cache fungiert). Das Problem bei MMO-Spielen im Gegensatz zu Web-Apps besteht darin, dass sie in der Regel sehr statusbehaftet sind und für jeden Spieler viele Daten benötigt werden. Und die meisten Vorgänge erfordern den Zugriff auf alle oder fast alle dieser Daten.

Selbst wenn Sie einen einzelnen Server verwenden, müssen Sie mehrere Prozessoren nutzen. Jeder MMO-Server ist ein hochgradig gleichzeitiges Programm (unser aktueller Server hat ungefähr 30 gleichzeitige Threads). Um Synchronisationsprobleme lösen zu können, müssen Sie verschiedene Threads isolieren . Wie verschiedene Server verfügen sie über eigene Daten und kommunizieren über eine Art Nachrichtenübermittlungsschnittstelle. Möglicherweise sogar derselbe RPC, den Sie im Netzwerk verwenden, wenn er schnell genug ist.

Dann haben Sie Ihre Datenbank. MMO-Spieler machen normalerweise viele Dinge und generieren eine Menge Chages für die Spielwelt, die in der Datenbank gespeichert werden müssen. Alle Server, mit denen ich gearbeitet habe, haben diese nicht sofort gespeichert. Stattdessen wurden Änderungen im Speicher gesammelt und dann etwa alle 5 Minuten in großen Mengen gespeichert. Dies ermöglicht einen reibungsloseren Spielverlauf auf Kosten einer möglichen Verzögerung beim Schreiben. Diese Verzögerung ist der Hauptgrund für eine separate Maschine für die Datenbankkommunikation.

Normalerweise verwenden MMO-Spiele relationale Datenbanken als Daten-Backend, aber ich glaube, dass NoSQL-Datenbanken besser sein könnten. Normalerweise haben Sie eine Reihe von Daten in Ihrer Datenbank für jedes Zeichen, laden alles, wenn sich das Zeichen anmeldet, und führen sehr selten, wenn überhaupt, komplexe Abfragen durch. Diese Betriebsart scheint die Stärke von NoSQL zu sein. Trotzdem habe ich noch keine NoSQL-Datenbank mit einem tatsächlichen MMO-Server verwendet, daher kann ich mich hier irren.

Eine andere datenbankbezogene Sache, vor der ich Sie warnen möchte, ist diese. Viele Entwickler, insbesondere zu Beginn des Produktionszyklus, sind versucht, "Game-Design" -Daten in einer Datenbank zu speichern. Ich spreche über Dinge wie Parameter, Fähigkeiten und andere Dinge von Gegenständen und NPCs. Tu das nicht. Diese Dinge sind tatsächlich statische Daten, die sich nur ändern, wenn ein Server-Update vorliegt. und diese Daten werden immer vom Server benötigt. Normalerweise werden Sie keine Abfragen dagegen durchführen, außer SELECT * ...beim Start des Servers. Sie benötigen also eigentlich keine Datenbank, und diese Dinge in einer Datenbank zu haben, hat viele Nachteile. Zum einen können Sie eine Datenbank nicht der Quellcodeverwaltung unterwerfen.

Dies sind drei Hauptkomponenten für eine MMO-Serverarchitektur: Netzwerkkommunikation, Logikpartitionierung und Datenbankzugriff. Alle Logik, die diese drei verwendet, ist wahrscheinlich sehr spielabhängig. Ich könnte weitere Ratschläge haben, wenn Sie spezifischere Fragen stellen und uns mehr über das Spiel erzählen.

Keine Ursache
quelle
Ich würde gerne mehr Ratschläge von Ihnen erhalten, aber ich kann keinen Weg finden, direkt mit Ihnen zu kommunizieren (eine PM oder so etwas). Ich möchte nur nicht öffentlich die Innenseiten meines Spiels preisgeben.
Draiken
Sie können mich per E-Mail und / oder Googletalk unter cthulhu dot in gmail dot com erreichen.
Nevermind
4
Obwohl ich dringend empfehle, dass Sie hier so viel wie möglich und nicht privat fragen. Auf diese Weise würden mehr Menschen davon profitieren und Sie würden bessere Antworten erhalten.
Nevermind
0

Sie möchten sich wahrscheinlich mit der Socket-Programmierung befassen. Hier ist eine grundlegende Einführung , die Ihnen den Einstieg erleichtert.

Oder führen Sie einfach eine Google-Suche nach Java-Sockets durch und Sie werden viel Material finden.

bummzack
quelle
1
Ich habe bereits Sockets verwendet, RMI, EJB und andere Kommunikationsmethoden verwendet, aber das Problem sind nicht die Grundlagen der Verwendung, sondern die Art und Weise, wie es verwendet werden SOLLTE oder warum dies oder jenes verwendet werden sollte.
Draiken
Oh ok. Ich habe deine Frage dann falsch verstanden. Es tut uns leid.
Bummzack