mmofacts.com

Überlegungen Echtzeit-Daemon

gepostet vor 15 Jahre, 8 Monate von blum

Hallo
ich plane gerade mein Backend und ich bin gerade an einem Punkt, wo ich mir nicht ganz sicher bin,
ob es wirklich so sinnvoll ist, was ich mir da ausgedacht hab.
Vereinfacht würde meine meine Aufteilung so aussehen:
Browser <-> CGI <-> C++ Daemon <-> Datenbank
Der Daemon läuft ständig und nimmt über einen Socket Befehle des CGI-Skripts an. ZB Held läuft von A nach B.
Wenn sonst nichts passiert, würde der Browser in einem bestimmten Intervall nach Neuigkeiten fragen,
das CGI-Skript verbindet sich wieder mit dem Daemon und fragt nach, obs was Neues gibt.
So weit so gut.
Mir geht es jetzt hauptsächlich um den Daemon und die Datenbank.
Ich würde gerne die Datenbankzugriffe minimieren und dachte mir, dass der Daemon zwar alle Updates in die Datenbank schreibt, aber ansonsten
alle Informationen über Städte, Helden usw als Objekte gepeichert hält. Ich sehe darin den Vorteil, dass der Daemon alle Daten parat hält und schneller
Dinge berechnen kann, als ständig erst die Datenbank zu bemühen und zu schauen, ob's da überhaupt was zum holen/informieren/berechnen gibt.
Vor allem im Hinblick Fog of War.
Jetzt bin ich mir aber nicht sicher, ob das so schlau ist. Der Daemon müsste alle Städte, alle Truppen usw im Speicher halten.
Bei 2000 Spielern à 4 Städten im Durchschnitt und einigen Helden kommt da einiges zusammen.
Was meint Ihr, macht das Sinn? Ist das zuviel des Guten? Soll ich den Daemon lieber dumm halten und die Logik in der Datenbank belassen?
blum

gepostet vor 15 Jahre, 8 Monate von Todi42

Wenn Dir das zu viel vorkommt, dann leg doch nur die Daten von n Spielern im Speicher ab. Wenn die Daten des aktuellen Spielers nicht im Speicher liegen, lädst Du sie aus der DB. Sind bereits die Daten von n Spielern im Speicher, schmeist Du die Daten, auf die seit längstem nicht mehr zugegriffen hast aus dem Speicher. Ich habe so etwas mal gemacht, die Daten standen dann sogar in shared memory, auf denen alls Prozesse des Systems zugreifen konnten. Bei einer 10% cache miss rate war das dann um Faktor 1000 schneller als das direkte lesen aus einer sehr gut getunten/gecacheten oracle Datenbank.

gepostet vor 15 Jahre, 8 Monate von Kallisti

Sofern du mit dem harten Userlimit leben kannst, sollte es die beste Loesung sein. Das Hauptproblem ist eben, dass das Ganze so nicht skaliert. Irgendwann ist schluss und dann kannst du auch nicht einfach einen Server dazustellen und wieder mehr User in die Welt lassen, sondern musst unabhaengige Welten erstellen (was ich doof finde xD).

Falls Du es noch nicht gesehen hast, da aehnliche Thematik: Scheduling / Eventqueue / Dispatching

Als Zwischenloesung koennte man noch versch. Dienste auf versch. Daemons aufteilen und so ein wenig skalieren, sofern eben der Webserver selbst nicht Bestandteil des Daemons ist.

gepostet vor 15 Jahre, 8 Monate von blum

Danke für die Antworten.

Das mit dem Löschen alter Daten hört sich gut an.

Dann werd ich das so machen.

Da der Daemon in C++ geschrieben ist, und ich mit der Konzeption eigentlich keine SELECTs zur Laufzeit brauche, sollte das Skript eigentlich auch sehr schnell laufen.

Arbeitsspeicher kostet ja eh nichts mehr. Und sollte ich mehr Resourcen brauchen, kann ich den Dienst immer noch auf versch. Server verteilen in einen Daemon für Kämpfe, einen für Aufträge usw.

gepostet vor 15 Jahre, 8 Monate von Kallisti

Joa, aber die gesamte Loesung skaliert nur so gut, wie der schwaechste all deiner Daemons.

gepostet vor 15 Jahre, 8 Monate von Todi42

Wenn Du auf Probleme stößt, darst Du gerne auch mich zurück kommen ;-)

Auf diese Diskussion antworten