Implementierung eines dynamischen Award-Systems

8

Ich habe ein Online Poker Spiel entwickelt. Aber ich trete immer wieder gegen eine Wand. Ich möchte Awards in das System implementieren, aber ich möchte, dass sie dynamisch sind. Das heißt, ich möchte nicht für jeden Award neu kompilieren, den ich hinzufügen möchte.

Ich habe darüber nachgedacht, für jede Auszeichnung Python-Code zu verwenden. Dann, wenn der Server überprüft, ob der Benutzer für die Auszeichnung qualifiziert ist, führt er das Python-Skript mit Jython (Server ist in Java und Netty NIO) und wenn die Funktion einen bestimmten Wert zurückgibt, übergebe ich die Auszeichnung an den Benutzer. Was könnte funktionieren, aber gibt es vielleicht eine effizientere Technik da draußen, die mich nicht dazu zwingt, jedes Mal Hunderte von Python-Skripten auszuführen, wenn ich überprüfen muss, ob ein Benutzer eine Auszeichnung erhalten hat.

Und wann sind die besten Zeiten für diese Kontrollen? Ich habe über ein Hook-System gelernt, bei dem ich die Hooks wie ([onconnect] [ondisconnect] [chatmessage.received]) angeben werde. Das könnte auch funktionieren, fühlt sich aber ein bisschen grob an und ich werde immer noch alle Skripte aus der Datenbank ausführen müssen.

    
Johann du Toit 04.08.2011, 09:48
quelle

4 Antworten

6

Wenn ich Sie wäre, hätte ich einen völlig separaten Prozess, der Auszeichnungen verleiht. Es läuft vielleicht einmal am Tag auf der zugrunde liegenden Datenbank, die alle Ihre Spieler / Spieldaten enthält.

Ihre Kernapplikation für Kunden kennt Auszeichnungen, aber alles, was sie über sie wissen, sind Daten, die sie aus der DB lädt - so etwas wie Titel, Bild, Beschreibung, vielleicht wie viele Leute die Auszeichnung haben usw. basierend auf DB-Tabellen), wer den Preis gewonnen hat.

Ihr "award granter" -Verfahren läuft einfach im Batch-Modus, einmal pro Tag / Stunde usw. und vergibt neue Prämien an berechtigte Spieler. Dann werden sie von der zentralen, kundenorientierten App benachrichtigt, müssen aber nicht wirklich wissen, wie man sie gewährt. Dies gibt Ihnen die Freiheit, Ihren Award Granter zu jeder Zeit neu zu kompilieren und erneut auszuführen, ohne dass dies Auswirkungen auf die Kern-App hat.

Ein anderer Ansatz, abhängig davon, wie eingeschränkt Ihre Auszeichnungen sind, wäre das Schreiben einer einfachen Regelschnittstelle, mit der Sie Regeln in Daten definieren können. Das wäre ideal, um zu erreichen, was du beschreibst, aber es ist meiner Meinung nach ziemlich viel Arbeit für nicht viel Belohnung.

PS - Wenn Sie so etwas wie einen Online Poker Server laufen lassen, werden Sie ständig auf Versionen dieses Problems stoßen. Sie müssen unbedingt einen Weg entwickeln, wie Sie neuen Code bereitstellen können, ohne Ihren Dienst zu beenden oder ein Ausfallzeitfenster zu haben. Eine Lösung mit java-zentrischem Code für Auszeichnungen zu umgehen wird dieses Problem auf lange Sicht nicht lösen. Sie sollten in der Literatur nachlesen, wie man echte 24/7-Dienste betreibt, es gibt eine ganze Reihe von Möglichkeiten, das Problem anzugehen, und das ist heutzutage gar nicht so schwierig.

    
jkraybill 15.08.2011, 23:42
quelle
3

Es gibt eine Reihe von Möglichkeiten, die ich mir vorstellen kann:

  • OSGi wie oben beschrieben - es hat seinen Preis, ist aber wahrscheinlich die allgemeinste und dynamischste Lösung da draußen
  • Wenn Sie zum Neustart bereit sind (einfach nicht neu kompilieren), erhalten Sie mit einer Sammlung von Gläsern in einem bekannten Ordner und einer Feder eine günstigere, aber ebenso generische Lösung. Lassen Sie Ihre Award-Beans eine Standard-Schnittstelle implementieren, seien Sie Beans und lassen Sie Spring @Autowire alle verfügbaren Auszeichnungen in Ihren Checker einfließen.
  • Wenn Sie die Ausführung von Auszeichnungen als Standard festlegen und die einzige Variation zwischen Auszeichnungen die Regeln selbst sind, können Sie eine Art Skriptkonfiguration verwenden. Viele Optionen gibt es, von der Python, die du beschrieben hast (außer dass ich ein paar große Skripte für alle Auszeichnungen verwenden würde), bis hin zu regulären Grundausdrücken, mit LUA und Drools in der Mitte. In allen Fällen sehen Sie sich eine Regelengine-Architektur an, die flexibel ist, was der Award auslösen kann, bietet aber nicht viel Flexibilität in Bezug darauf, wozu ein Award führen kann (dh perfekt für Leistungen).
ptyx 15.08.2011 23:26
quelle
3

Einige Kommentare zur Antwort mit Batch-Ideen: Implementierung eines dynamischen Award-Systems

Diese Batch-Prozesse können sich auf einem separaten Server / Computer befinden, sodass Sie die App jederzeit neu kompilieren oder den Server neu starten können. Diese neuen Auszeichnungen können beispielsweise unter Verwendung des erwähnten Ansatzes mit dem Hinzufügen von Gläsern und Neustarten des Servers gehandhabt werden, ebenso können neue Stapeljobs jederzeit eingeführt werden und so weiter. Ihre Hauptanwendung wird zu 99% ausgeführt, der Batch-Server kann häufig neu gestartet werden. So separate Batch-Maschinen ist gut zu haben.

Wenn Sie eine neue Version der Core-App bereitstellen müssen, können Sie sie einfach anhalten, bereitstellen und mit Wartungshinweisen für Benutzer starten. Dieser Ansatz wird sogar von Top-Pokerräumen mit großartiger Software verwendet (z. B. hat FullTiltPoker dies getan, jetzt ist es wegen des Lizenzverlustes nicht mehr da, aber auf ihrer Seite steht 'System Update' :)).

Ein Ansatz für das Versionsupdate besteht also darin, außerhalb der Geschäftszeiten erneut bereitzustellen / neu zu starten.

Ein anderer Ansatz sind Echtzeit-Updates. In der Regel wird dies getan, indem Benutzer von Gruppe zu Gruppe zu neuer Version migriert werden. Zur gleichen Zeit verwenden einige Benutzer alte Versionen, einige neu. Nicht gerade cool für Poker-Software, wo Benutzer mit verschiedenen Versionen interagieren können. Wenn Sie jedoch sicher sind, dass die Versionen "kompatibel" sind, können Sie mit diesem Ansatz gehen und die Client-Version des Benutzers überprüfen, zum Beispiel bei der Anmeldung.

In meiner Antwort habe ich versucht zu sagen, dass Sie Ihrem Code keine 24/7 Supportlogik hinzufügen müssen. Belassen Sie diese Systemverfügbarkeitsprobleme für die Hardware (Failovers, Loadbalancer usw.). Sie können alle guten Techniken befolgen, die Sie zum Schreiben von Code verwendet haben, nur müssen Sie sich daran erinnern, dass Ihre entscheidende Kernlogik nicht häufig eingesetzt wird (z. B. einmal pro Woche) und der Batch-Teil bei Bedarf jederzeit aktualisiert / neu gestartet werden kann. p>     

Andrey 16.08.2011 21:04
quelle
2

Soweit ich Sie verstehe, müssen Sie wahrscheinlich keine externen Prozesse von Ihrer Anwendung aus ausführen oder OSGI verwenden. Erstellen Sie einfach eine einfache Java-Schnittstelle und implementieren Sie jedes Plugin ('award') als eine Klasse, die die Schnittstelle implementiert. Sie könnten dann einfach jedes neue Plugin kompilieren und es zur Laufzeit mit Hilfe von Class.forName(String className) als eine Klassendatei von Ihrer Anwendung laden. Jede Logik, die Sie von einem solchen Plugin benötigen, wäre in den Methoden der Schnittstelle enthalten.

Ссылка

    
MarianP 11.08.2011 18:31
quelle

Tags und Links