Frage

Ich bin Neuimplementierung ein altes BBS MUD Spiels in Java mit freundlicher Genehmigung von den ursprünglichen Entwicklern. Derzeit bin ich mit Java EE 6 mit EJB Session Fassaden für die Spiellogik und JPA für die Persistenz. Ein großer Grund, warum ich Session Beans gepflückt ist JTA.

Ich bin mehr erfahren mit Web-Anwendungen, in denen, wenn Sie einen OptimisticLockException bekommen Sie fangen es einfach und sagen Sie dem Benutzer ihre Daten veraltet ist und sie müssen erneut bewerben / erneut vorlegen. Als Reaktion mit „versuchen Sie es erneut“ die ganze Zeit in einer Multi-User-Spiel wäre für eine schreckliche Erfahrung machen. Da ich mehrere Menschen während eines Kampfes ein einzelnes Monster Targeting erwarten würde ich die Chance auf eine OptimisticLockException denken wäre hoch.

Meine Ansicht Code, der Teil einen Telnet-CLI präsentiert, ist das EJB-Client. Sollte ich die PersistenceExceptions und TransactionRolledbackLocalExceptions werden zu kontrollieren und nur Retrying? Wie entscheiden Sie, wann man aufhören muss?

Should I-Schalter auf pessimistische Sperren?

Ist persistierenden nach jedem Benutzerbefehl Overkill? Sollte ich die ganze Welt in RAM geladen und Dumping der Staat alle paar Minuten?

mache ich meine Sitzung Fassade eines EJB 3.1 Singletons, die als Drosselstelle funktionieren würden und daher entfällt die Notwendigkeit, jede Art von JPA Verriegelung zu tun? EJB 3.1 Singletons fungieren als mehrere Leser / Schreiber Einzel Design (Sie die Methoden als Leser und Schreiber mit Anmerkungen versehen).

Im Grunde, was ist das beste Design und Java Persistence API für hoch gleichzeitige Datenänderungen in einer Anwendung, wo es nicht akzeptabel vorhanden Resubmit / Wiederholungsaufforderungen an den Benutzer ist?

War es hilfreich?

Lösung

Das kann ich nicht helfen, aber das Gefühl, dass Sie massiv sind overcomplicating was ein einfaches Problem sein sollte.

Kommerzielle und erfolgreiche MMOs nehmen oft einen Ansatz wie folgt aus:

Every few minutes or after a significant action:
    copy the player data
    pass the player data to a background thread

In the background thread:
    write each piece of player data to the database

Es gibt nicht ‚sehr gleichzeitige‘ Datenänderungen, weil jeder Spieler seine eigenen Daten speichert, zu verschiedenen Reihen der Datenbank. (In einigen Fällen ist dies buchstäblich eine Zeile - mehr kommerziellen Spiele speichern nur die Spielerdaten als Blob gegen die Benutzer-ID.) Manchmal ist die Daten ein wenig abgestanden, aber das ist unwichtig. Es wird nur ein Problem, wenn der Server abstürzt, weil sonst werden Sie schließlich den aktuellen Zustand in die DB erhalten. Dies ist nicht Interbanküberweisungen wir reden.

Wie für MUDs und BBS-Spiele, dessen Algorithmus wäre einfacher gewesen, nach wie vor:

Every few minutes or after a significant action:
    For each property in the player object:
        write a property to the player's file

Auch hier gibt es keinen Streit hier, weil jeder Spieler ihre eigene Datei hat.

Persistierende nach jedem Benutzerbefehl ist in der Tat übertrieben, es sei denn, Ihr Spiel sehr monetarisiert und es gibt ein Risiko für Menschen, die Sie klagt, wenn sie ihre drei Ax of Awesome aufgrund eines Server-Absturz verlieren.

Und was sonst in der Welt tun müssen, um Sie als die Spieler andere bestehen bleiben? Es gibt oft negativ Gameplay Implikationen für persistierende alles andere, so in der Regel Sie nicht wollen, dies zu tun.

Wie für ‚Concurrent‘ Zugriff auf das gleiche Monster, wie pro Ihr Beispiel, spielt es keine Rolle. Wenn Sie einen einzelnen Prozess haben, sollte das Monster in RAM sein. Ihr einziger Prozess arbitriert, die das Monster und in welcher Reihenfolge getroffen wird. Das ist kein Job für Ihre Persistenz-Schicht. Behandeln Sie die Spiellogik im Spiel und bleiben die Ergebnisse.

Andere Tipps

Wenn ich mich recht erinnere, viele der klassischen MUDs in der Tat die ganze Welt in RAM geladen wurde und den Zustand regelmäßig entleeren. Natürlich sind meine Erinnerungen an dem Tag, dass eine 16MB Prozessgröße erschreckend betrachtet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top