Versuchen Sie, dies so einfach wie möglich zu halten und die Schnittstellen klar zu definieren und zu dokumentieren. Das Warten und Debuggen eines komplexen Systems in der Produktion wird leicht zur Hölle. Wenn es also einen einfachen und einen komplexen Ansatz gibt, überlegen Sie zweimal, bevor Sie mit dem komplexen Ansatz beginnen.
Services definieren
Ich denke, der erste Schritt besteht darin , Dienste und ihre Abhängigkeiten zu identifizieren : Statischer Inhalt, Authentifizierung, Lokaler Chat, Globale Chat-Kanäle, Regionale Chat-Kanäle, Freundesliste, Gilden, Tasche / Inventar, Auktionshaus, Globale Karte, Welt, ...
Dann wird für jede dieser Dienstleistungen entschieden, ob der Kunde direkt mit ihnen sprechen darf. Zum Beispiel ist es ziemlich einfach, den Client direkt mit den für globale Chat-Kanäle verantwortlichen Servern sprechen zu lassen. Die Server der Welt müssen überhaupt nicht an Chat-Nachrichten beteiligt sein. Regionaler Chat kann auf die gleiche Weise implementiert werden, aber die Server der Welt müssen den Chat-Servern mitteilen, wann Spieler die Region wechseln. Auch hier müssen sie sich nicht um die Nachrichten kümmern.
Der dritte Schritt ist das Überlegen des Lastenausgleichs innerhalb eines Dienstes . Beispielsweise können globale und regionale Chat-Kanäle basierend auf ihrem Namen auf mehrere Server aufgeteilt werden. Es ist wahrscheinlich eine gute Idee, diese Aufteilung in den Client nicht hart zu codieren, sondern einen Suchdienst bereitzustellen.
Weltserver
Der schwierigste Teil sind normalerweise die Server der Welt , daher beginne ich mit einem einfachen Ansatz. Es ist wahrscheinlich eine gute Idee, den Client direkt mit dem Server zu sprechen, der für die Region verantwortlich ist, in der er sich befindet. Beim Anmelden oder Überqueren der Region muss dem Client mitgeteilt werden, mit welchem Server er sich verbinden soll.
Der einfache Ansatz besteht darin, die Welt in unabhängige Regionen aufzuteilen . Mit unabhängigen Regionen meine ich, dass ein Spieler nicht von einem Teil in einen anderen schauen kann und Monster keine Teile überqueren können. Diese Regionen unterscheiden sich von den Regionen, die der Spieler aufgrund der Landschaft und der Geschichte der Außenwelt sieht. Normalerweise befinden sich die meisten Monster in Dungeons und die Spieler neigen dazu zu akzeptieren, dass sie durch ein Tor gehen müssen, um einen Dungeon zu betreten. Vor allem, wenn diese Dungeons pro Spielergruppe instanziiert werden. Andere Beispiele auf der Außenwelt sind verschiedene Kontinente und Täler, die von hohen Bergen umgeben sind.
Ein kontinuierlicher Weltansatz wird sehr schnell komplex, daher ist es sinnvoll, ihn gut zu planen: Welche Informationen benötigt der Kunde? Welche Informationen müssen die Server teilen? Der Spieler interagiert meist nur mit den Objekten (einschließlich Monstern und NSCs) in derselben Region. Sie können betrügen, indem Sie Objekte außerhalb des Klickbereichs vom Zonenrand platzieren. Dies bedeutet, dass der Kunde hauptsächlich an Nur-Lese-Informationen für benachbarte Zonen interessiert ist. In diesen Fällen müssen die Zonenserver bis auf die Berechtigungsprüfung nichts koordinieren, dass der Player nah genug ist, um eine Verbindung zu einer benachbarten Zone herzustellen.
Dies lässt nur eine sehr kleine Anzahl von schwierigen Fällen übrig, in denen Objekte oder Aktionen eine Servergrenze überschreiten müssen. Das ist gut so, denn solche Fälle wie Pfeile und Zauber sind leistungskritisch. Es kann eine gute Idee sein, den Kampf in Angriff und Verteidigung zu unterteilen. Der Server eines Zaubernden definiert also die Angriffsparameter einschließlich der Position des Zaubernden. Der Server des Verteidigers erhält die Nachricht über den Angriff und berechnet die Auswirkungen. Der Server des Angreifers muss die Auswirkungen nicht kennen. Der Client erfährt davon über seine Nur-Lese-Verbindung.
Je nachdem, wie komplex Ihr Playermodell ist, kann es einige Sekunden dauern, bis es auf einen anderen Server übertragen wird (Second Life hat ein großes Problem damit). Das Problem kann behoben werden, indem der Transfer im Voraus vorbereitet wird , wenn sich der Spieler einer virtuellen Grenze nähert. Damit die meisten Player-Daten bereits beim eigentlichen Handover auf dem Zielserver zwischengespeichert sind.
Zusammenfassung
Teilen Sie das Problem auf, indem Sie verschiedene Dienste definieren, die auf Server mit geringen Abhängigkeiten aufgeteilt werden können. Schauen Sie sich im nächsten Schritt an, wie Sie den Lastausgleich innerhalb der kritischen Services durchführen. Delegieren Sie die Ausgleichsarbeit an den Client, indem Sie ihn anweisen, sich direkt mit den relevanten Servern zu verbinden (offensichtlich müssen die Server die Berechtigungen überprüfen). Machen Sie es sich so einfach wie möglich, dokumentieren Sie die Verantwortlichkeiten der verschiedenen Dienste und Server und aktivieren Sie die Debug-Ausgabe.
PS: Einige dieser Techniken können verwendet werden, um die Zuverlässigkeit zu verbessern. Und Sie sollten dies berücksichtigen, da die Verwendung vieler Server ein viel höheres Risiko mit sich bringt, dass Dinge kaputt gehen. nicht nur in der Software, sondern auch auf Hardwareebene.