簡體   English   中英

實施動態獎勵制度

[英]Implementing a Dynamic Award System

我一直在開發在線撲克游戲。 但我一直在撞牆。 我想在系統中實施獎勵,但我希望它們是動態的。 意思是我不想重新編譯我想要添加的每個獎項。

我曾考慮過為每個獎項使用Python代碼。 然后,當服務器檢查用戶是否有資格獲得獎勵時,它運行帶有Jython的python腳本(服務器在Java和Netty NIO中),如果函數返回某個值,我將獎勵授予用戶。 哪個可以工作但是可能有更高效的技術,每次我需要檢查用戶是否獲得獎勵時,不會強迫我運行數百個python腳本。

什么時候進行這些檢查的最佳時間? 我已經考慮了一個鈎子系統,我將指定鈎子([onconnect] [ondisconnect] [chatmessage.received])。 哪個也可以工作,但感覺有點粗糙,我仍然必須從數據庫運行所有腳本。

如果我是你,我會有一個完全獨立的過程來授予獎勵。 它可能每天在包含所有播放器/游戲數據的底層數據庫上運行一次。

您的面向客戶的核心應用程序了解獎項,但它所知道的只是它從數據庫加載的數據 - 例如標題,圖像,描述,可能有多少人擁有該獎項等等,以及(基於數據庫)表格)誰贏得了獎項。

您的“獎勵過程”過程只需以批處理模式運行,每天/每小時一次等,並為符合條件的玩家提供新獎勵。 然后面向客戶的核心應用程序通知他們,但實際上並不知道如何授予他們的聰明才智。 這使您可以隨時自由地重新編譯和重新運行獎勵計划,而不會影響核心應用程序。

另一種方法,取決於您的獎勵受限制,將是編寫一個簡單的規則界面,允許您在數據中定義規則。 這對於實現你所描述的內容是理想的,但在我看來,這對於沒有多少獎勵來說是相當多的工作。

PS - 在運行類似在線撲克服務器的東西時,你會一直遇到這個問題的版本。 您絕對需要開發一種部署新代碼的方法,而不會中斷您的服務或有停機時間窗口。 從長遠來看,圍繞以Java為中心的獎勵代碼解決方案並不能解決這個問題。 您應該查看有關運行真正的24/7服務的文獻,有很多方法可以解決這個問題,而且這些日子實際上並不困難。

我能想到很多選擇:

  • OSGi如上所述 - 它需要付出代價,但可能是最通用和最動態的解決方案
  • 如果你打開重啟(只是不重新編譯),一個眾所周知的文件夾和spring中的jar集合會給你一個更便宜但同樣通用的解決方案。 只需讓你的獎勵bean實現一個標准的界面,成為豆子,讓春天的人物@Autowire將所有可用的獎勵計入您的檢查器。
  • 如果獎勵執行是相當標准的,並且獎勵之間的唯一差異是規則本身,您可以使用某種腳本配置。 那里有很多選項,從你描述的python(除了我要管理所有獎項的幾個大腳本),到基本的正則表達式,LUA和Drools在中間。 在所有情況下,您都在尋找某種規則引擎架構,這種架構在獎勵可以觸發的方面具有靈活性,但在獎勵可以帶來的方面(即完美的成就)方面卻沒有多大的靈活性。

對批量創意的答案有一些評論: 實施動態獎勵系統

批處理進程可以在單獨的服務器/機器上,因此您可以隨時重新編譯應用程序或重新啟動服務器。 可以使用例如添加罐子並重新啟動服務器的上述方法來處理新的獎勵,也可以隨時引入新的批處理作業,等等。 因此,您的核心應用程序在99%的時間內運行,批處理服務器可以經常重啟。 因此,單獨的批處理機器是很好的。

當您需要部署新版本的核心應用程序時,我認為您可以通過向用戶發送維護通知來停止,部署和啟動它。 即使是擁有出色軟件的頂級撲克室也使用這種方法(例如FullTiltPoker這樣做,現在由於許可證丟失而下降,但他們的網站顯示'系統更新':))。

因此,版本更新的一種方法是在非工作時間重新部署/重新啟動。

另一種方法是實時更新。 通常,它是通過將用戶逐束遷移到新版本來完成的。 所以同時一些用戶正在使用舊版本,有些用戶正在使用舊版本。 撲克軟件不是很酷,不同版本的用戶可以互動。 但是,如果您確定版本的“兼容性”,則可以使用該方法,例如在登錄時檢查用戶的客戶端版本。

在我的回答中,我試圖說你不需要為你的代碼引入24/7支持邏輯。 保留硬件的系統可用性問題(故障轉移,負載均衡器等)。 您可以遵循用於編寫代碼的任何好技術,只需記住您的關鍵核心邏輯不經常部署(例如每周一次),並且批量部分可以隨時更新/重新啟動(如果需要)。

據我了解,您可能不必從應用程序運行外部進程也不必使用OSGI。 只需創建一個簡單的Java接口,並將每個插件('award')實現為實現接口的類。 然后,您可以簡單地編譯任何新插件,並使用Class.forName(String className)在運行時將其作為類文件加載到應用程序中。 您需要從這樣的插件中獲得的任何邏輯都將包含在接口上的方法中。

http://download.oracle.com/javase/1,5.0/docs/api/java/lang/Class.html#forName(java.lang.String)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM