Die Hauptkomplexität bei der Verwaltung eines solchen Systems besteht darin, wie nahtlos es sein muss. Wie Josh gesagt hat, ist die Lösung des Problems, eine Entität von einem Server auf einen anderen zu übertragen, ein wesentlicher Bestandteil des Pakets.
Dies ist jedoch nicht das einzige Problem. Wenn Entitäten auf mehreren Servern als Teil eines Vorgangs interagieren müssen, tritt jetzt ein Synchronisierungsproblem auf, bei dem jedes System Daten von der anderen Seite benötigt, um fortzufahren. Bis zum Eintreffen der Daten kann dies jedoch der Fall sein schon ungültig sein. Sie können versuchen, dieses Problem zu lösen, indem Sie den Vorgang in mehrere Nachrichten mit Rollback-Funktion aufteilen, wenn sich eine Seite zurückzieht. Wie Sie jedoch aus Kapitel 3.1 in "Massively Multiplayer Game Development" gesehen haben, verkompliziert dies jede Spiellogik, die Sie benötigen, erheblich mach das mit. Scala und Erlang helfen Ihnen dabei, das Messaging-System richtig zu machen - sie helfen Ihnen nicht bei der Zerlegung einer früheren 10-Zeilen-Funktion in die vielen verschiedenen Nachrichten und Zustände, die Sie jetzt verfolgen müssen.
Offensichtlich ist dieses Problem nicht ganz neu, und relationale Datenbanken unterstützen diese Art von Problem, indem sie alle Daten zentral speichern und es mehreren Clients ermöglichen, sie nach Bedarf abzufragen und zu ändern und Transaktionen bei Bedarf zurückzusetzen. Dies gibt Ihnen die meisten Ihrer Korrektheitsanforderungen, führt jedoch leider zu unpraktischen Leistungsproblemen und macht die Implementierung der Spielelogik umständlich (da ein Großteil Ihrer Logik jetzt in gespeicherten Datenbankprozeduren geschrieben ist). Eine andere Art von Datenbank könnte hier eine gute Lösung sein, insbesondere wenn Sie bereit sind, die Zuverlässigkeitsanforderungen, die die meisten RDBMS bieten, wegzutauschen.
Die meisten professionellen Spiele umgehen dieses Problem, indem sie es nicht einmal versuchen, indem sie die Shard-Größe klein genug halten, um alle Spieler auf einen Server zu bringen, indem sie die Welt in Teile aufteilen, die nicht wirklich interagieren (siehe das WoW-Beispiel in den Kommentaren oben). oder indem Sie das Spiel auf der Grundlage der Funktion und nicht der Geografie auf die Server verteilen (z. B. findet jeder Kampf auf einem Server statt, alle chatten auf einem anderen), sodass keine „Nähte“ zu bewältigen sind.