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.