Vor langer Zeit gab es dieses webbasierte Spiel namens Utopia (und ich bin sicher, es gibt es immer noch), die Runden sind pro Stunde vorbei. Sie bekommen nur jede Stunde neues Gold / Holz oder was-nicht.
Bei einigen neueren webbasierten Spielen werden Ressourcen mit einer feineren Auflösung wie pro Minute erhöht. Angenommen, ein Spieler hat eine Lebensmittelproduktionsrate von 5 pro Minute - die Lebensmittelmenge des Spielers erhöht sich jede Minute. Ich bin mir nicht sicher, ob es sinnvoll ist, ständig einen CRON-Job zum Aktualisieren der SQL-Datenbank festzulegen. Ich gehe davon aus, dass diese verwendet wird, da sie webbasiert ist. Vielleicht irre ich mich jede Minute.
Welche Techniken verwenden diese webbasierten Spiele? Hinzugefügt bei Bearbeiten: Und kann die Datenbank die Last wirklich bewältigen?
In modernen SQL-Datenbanken, die häufig verwendet werden (MySQL, Postgres, Oracle, MSSQL usw.), können Sie gespeicherte Prozeduren so planen, dass sie in beliebigen Zeitintervallen ausgeführt werden. Es ist eine sehr einfache Methode zum Ausführen solcher Updates und macht das Aufrufen eines externen Skripts oder Programms überflüssig, um dies für Sie zu tun.
Auf diese Weise kann die Datenbank auch die Abfrage optimieren, die Sie nur einmal ausführen, anstatt sie jedes Mal auszuführen, wenn ein externes Skript sie aufruft. Daher ist sie vom Standpunkt der Leistung aus sehr nützlich. Dies gilt natürlich nur, wenn Ihre Updates trivial genug sind, um in der eigenen Skriptsprache Ihrer Datenbank programmiert zu werden. Ressourcenaktualisierungen, automatische Abmeldungen von Zeitintervallen, Löschen von Datensätzen und dergleichen sind hervorragende Kandidaten für diese geplanten gespeicherten Prozeduren.
Die Last, die Ihre Datenbank erfährt, ist höchstwahrscheinlich zu 99,9% auf das Laden von Seiten, Game Engine-Updates und dergleichen zurückzuführen, da ein beliebtes Spiel leicht Hunderttausende von Abfragen pro Sekunde haben kann. Im Vergleich zu der Last, die durch das Ausführen einiger Abfragen (obwohl solche, die einen großen Teil einer Tabelle berühren) einmal pro Minute entsteht, sollte die Last kein Problem darstellen. Das heißt, es sei denn, Sie aktualisieren Werte, die von der Datenbank indiziert werden. Sie sollten um jeden Preis vermeiden, indizierte Spalten zu aktualisieren, wenn Sie sich Gedanken über die Leistung machen.
quelle
Zu den Updates:
Einige verwenden CRON-Jobs, die von Zeit zu Zeit auf eine bestimmte PHP-Seite gelangen.
Einige verwenden CRON-Jobs und führen diesmal einen bestimmten Prozess aus.
Ein anderer Ansatz besteht darin, "just in time" -Updates durchzuführen. Wenn eine Seite geladen wird, führen Sie alle ausstehenden Updates durch und führen Sie sie zu diesem Zeitpunkt aus. Dies ist im Allgemeinen das, was Sie tun müssen, wenn Sie keine CRON-Jobs oder Prozesse mit langer Laufzeit ausführen können.
Schließlich führen andere die gesamte Webanwendung als einen Prozess aus, sodass sie jederzeit aktualisieren können, wenn sie sehen, dass es Zeit ist.
Das endgültige System ist das beste, wenn Sie diese Option zur Verfügung haben, da Sie die Daten im Speicher speichern können. Das Aktualisieren einiger tausend Spieler einmal pro Minute ist trivial, wenn Sie nur Daten im RAM ändern, anstatt in eine herkömmliche SQL-Datenbank schreiben zu müssen.
Aber wenn Sie diesen Luxus nicht haben, können Sie eine Art Caching verwenden. So etwas wie memcached kann eine Option sein (abhängig von Ihrem Hosting), die einen halben Weg zwischen Speicher und Datenbank darstellt. Sie können transiente Werte im Memcache speichern und nur dann in der Datenbank speichern, wenn dies unbedingt erforderlich ist.
Zwischen Memcache und einer herkömmlichen SQL-Datenbank gibt es andere Optionen, z. die verschiedenen Schlüssel- / Wertspeicher oder Dokumentenspeicher: Dinge wie MongoDB , CouchDB , die Amazon- oder Google-Angebote usw., dh. alle Systeme unter dem Oberbegriff NoSQL . Diese bieten Ihnen normalerweise weder die generische Abfrageleistung noch immer die gleichen Sicherheitsgarantien wie bei einer herkömmlichen Datenbank, sind jedoch häufig viel schneller im Betrieb. (Was nicht so überraschend ist, da sie weniger für Sie tun.)
Dies setzt jedoch voraus, dass eine normale Datenbank die Last nicht bewältigen kann. In den meisten Fällen ist dies wahrscheinlich der Fall. Wenn ich 10.000 UPDATE-Aufrufe pro Minute ausführen muss, um die Ressourcenebene zu erhöhen, ist dies nicht sehr skalierbar, sobald Sie alles andere hinzufügen. Wenn Sie dies jedoch ändern, um die Ressource für alle Benutzer mit einem SQL-Aufruf zu aktualisieren, sehen die Dinge plötzlich viel positiver aus. Überschätzen Sie also nicht, wie teuer eine bestimmte Funktion ist, da sie häufig effizienter implementiert werden kann.
quelle
Ich bin für KISS : "Halte es einfach, dumm!"
Ich sehe keinen Grund, warum ein Cron-Job nicht funktionieren würde, und der Vorteil ist, dass Sie mit billigen Webhosting-Optionen häufig keine Befehle direkt ausführen können, aber Sie können Cron-Befehle ausführen. Es ist also kein teurer dedizierter Server erforderlich.
Sie können Ihren Update-Code auch in PHP oder Ihrer bevorzugten Sprache ausführen, indem Sie entweder den Befehl cron verwenden oder den Textbrowser verwenden. Die Anweisungen unter Konfigurieren von Cron-Jobs enthalten mehrere Beispielbefehle, mit denen Sie Ihre eigene Seite in regelmäßigen Abständen anpingen können.
wget --spider http://yoursite.com/secretphppage.php
lynx
quelle
Ich erinnere mich, dass ich mir den Code eines Planetarion-Klons angesehen habe. Alles ist PHP, aber der Ticker-Code ist in rohem C - mit C MySQL-Bindungen. Da das Datenmodell sehr einfach war, erfolgen die Aktualisierungen sehr schnell.
quelle