Frage

Ich möchte ein Browserspiel erstellen, in dem Spieler Gebäude einrichten können.

Jedes Gebäude verfügt über mehrere Module (Motoren, Büros, Produktionslinien, ...). Jedes Modul hat einen oder mehrere Aktionen, die ausgeführt werden, wie die Erstellung von 2OO 'Artikel X' mit Zutaten y, Z.

Der Spielserver wird mit Erlang: Eine OTP -Anwendung als Server selbst und Stickstoff als Webfront eingerichtet. Ich brauche eine Beharrlichkeit von Daten. Ich dachte über Folgendes nach:

Wenn jemand oder etwas mit einem Gebäude oder einem Timer, der eine Produktionslinie darstellt, endet, erzeugt ein Supervisor einen Gen_Server (falls dies nicht bereits ausgelöst), das den Status des Gebäudes aus einer Datenbank lädt, sodass der Gen_Server Nachrichten wie 'Hinzufügen hinzufügen kann' hinzufügen kann 'hinzufügen' hinzufügen 'hinzufügen' hinzufügen 'hinzufügen' hinzufügen 'hinzufügen' hinzufügen 'hinzufügen' hinzufügen 'hinzufügen' hinzufügen 'hinzufügen' hinzufügen 'addieren von einer Datenbank. Dieses Modul "," startet diese Aktion "," Speichern Sie diese Produktion in Lagerhaus "," Die "usw. ((

Wenn ein Gebäude in x Sekunden oder Minuten keine Nachrichten erhält, wird er (dank der Timeout -Funktion von Gen_server) beendet und seinen aktuellen Status zurück in die Datenbank fallen.

Da es sich also um ein (sanftes) Echtzeitspiel handelt, muss der Gen_Server sehr schnell eingerichtet werden. Ich dachte an Membase als Datenbank, weil es bekanntermaßen eine sehr gute Reaktionszeit hat.

Meine Frage ist : Wenn ein Gen -Server ein ausgeführt wird, füllen seine Zustände einen Speicher, und dieser Status ist auch in der von Membase behandelten Speicher vorhanden, sodass der Zustand zweifache seiner Größe im Speicher verwendet. Ist das ein schlechtes Design?

Ist Membase eine gute Lösung, um in meinem Fall Persistenz zu behandeln? Würde MNEsia eine bessere Wahl oder etwas anderes verwenden?

Ich fürchte, mnesia 2 go (oder 4?) Tischgrößengrenze, weil ich momentan nicht weiß, dass die durchschnittliche Zustandsgröße meiner Gen_Servers (Gebäude in diesem Beispiel, Butals -Spieler, Produktionslinien, was auch immer) und ich vielleicht eines Tages mehr als 1 Spieler :)

Vielen Dank

War es hilfreich?

Lösung

Ich stimme Hynek -pichi -vychodil zu. Riak ist eine großartige Sache für die Speicherung von Schlüsselvalien.

Wir verwenden RIAK fast 95% für das gleiche, was Sie beschrieben haben. Alles funktioniert bisher ohne Probleme. Falls Sie die Leistungsbeschränkung von Riak erreichen - fügen Sie weitere Knoten hinzu und es ist gut zu gehen!

Eine weitere coole Sache über Riak ist die sehr geringe Leistungsverschlechterung im Laufe der Zeit. Weitere Informationen zum Benchmarking RIAK finden Sie hier: http://joyeur.com/2010/10/31/riak-smartmachine-bchmark-technical-details/

Falls Sie damit gehen:

Über Membase und Speicherverbrauch: Ich habe auch Membase ausprobiert, aber ich stellte fest, dass es nicht für meine Aufgaben geeignet ist - (Membase erklärt die Fehlertoleranz, aber ich konnte sie nicht so einrichten, wie es mit Fehlern funktionieren sollte, auch mit Hilfe von Membase -Jungs Ich habe es nicht gelungen). Im Moment verwende ich die folgende Architektur: Alle Spieler, die online sind und das Spiel spielen, werden als Spielerprozesse (Gen_Server) präsentiert. Alle Daten- und Geschäftslogik für jeden Spieler befinden sich in seinem Spielerprozess. Von Zeit zu Zeit bezieht sich jeder Spielerprozess, um seinen Staat in Riak zu retten.

Bisher scheint ein sehr schneller und effizienter Ansatz zu sein.

UPDATE: Jetzt sind wir bei PostgreSQL. Es ist beeindruckend!

Andere Tipps

Sie können nachsehen Bitcask oder andere Rioch Backends, um Ihre Daten zu speichern. Vermeiden Sie IPC ist definitiv eine gute Idee. Halten Sie es also in Erlang.

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