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.
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.
Es gibt eine Reihe von Möglichkeiten, die ich mir vorstellen kann:
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>
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.