本文我們來解決一個常見的問題,那就是在ESPlatform群集之外如何訪問和控制ESPlatform群集了?
在 ESPlatform 群集平臺(01) -- 遷移到群集平臺 一文中,我們提到ACMS提供了三個Remoting服務接口:IApplicationService、IClusterControlService、IPlatformCustomizeService。 IApplicationService我們已經介紹過了,而 IClusterControlService 和 IPlatformCustomizeService 正是ESPlatform群集系統提供給外部系統(如BL)來訪問或控制群集的。
通常我們會這樣做,將ACMS暴露的 IClusterControlService 和 IPlatformCustomizeService作為群集系統對外暴露的唯一通道,外部系統只能通過ACMS提供的這兩個接口與整個群集系統通信。外部系統不要直接與某個AS通信,除非我們有充分的理由,否則,不要輕易破壞這一規則。這一規則的目的在于,盡可能使整個系統(可能是很龐大的、復雜的)保持簡潔的、清晰的結構。
一.IClusterControlService接口
IClusterControlService接口用于訪問群集系統中的AS服務器信息或控制群集中的服務器。IClusterControlService的定義如下:
1.AS基礎信息與事件
當我們動態地向群集中添加一臺AS時,ACMS將會觸發IClusterControlService接口的ServerRegistered事件;同樣的,當動態地從群集中移除一臺AS時,將觸發IClusterControlService接口的ServerUnregistered事件。請注意,如果某臺AS意外掛掉,則ACMS是不知情的,我們必需手動調用IClusterControlService接口的RemoveServer方法,此方法的執行仍然會觸發IClusterControlService接口的ServerUnregistered事件。
GetServer用于獲取群集中某臺AS的詳細信息,其返回的ClusterServerInfo類圖如下:
通過返回的ClusterServerInfo,我們可以知道目標AS基本信息:啟動時間、IP端口地址、在線用戶數量、當前的CPU使用率、內存使用率、是否處于凍結狀態。
2.群集分配策略
所謂群集分配策略,就是當一個客戶端要連接到AS時,我們應該分配群集中的哪臺AS給他?選擇AS所采取的策略就是群集分配策略。
AS內置了三種常見的群集分配策略:輪詢、人數最少、CPU利用率最小。該策略由ServerAssignedPolicy枚舉定義:
在ACMS的配置文件ESPlatform.ACMServer.exe.config中,有key為ServerAssignedPolicy的配置項,我們可以在此指定所采用的AS分配策略。
IClusterControlService接口的GetServerToLogon方法將依據ServerAssignedPolicy的設置返回恰當的AS。
當我們想讓某臺AS不再接受新的客戶端連接時,可以調用FreezeServer方法來凍結它。當AS被凍結后,GetServerToLogon方法將永遠不會返回這臺AS。
當然,我們也可以完全自己定義AS的分配策略,而忽略ACMS提供的內置的分配策略的存在。
假設我們已經采用了ACMS內置的分配策略或實現了自定義的分配策略,那么,客戶端如何知道自己要登錄到哪個AS了?需要有個第三方來提供這一查詢服務。我們可以簡單地做到這一點,比如,發布一個WebService,客戶端先通過訪問該WebService獲取要登錄的AS的地址,然后再去連接目標AS,等等。
二.IPlatformCustomizeService 接口
如果,希望從外部發送一個指令給群集中的某臺AS或在線的某個客戶端,該如何做了? 我們可以使用ACMS暴露的IPlatformCustomizeService接口。
就像ESPlus提供的自定義信息功能一樣,我們可以從群集外部通過IPlatformCustomizeService接口發送自定義信息甚至同步調用給某個AS或某個在線客戶端,當然,這些信息都是經過ACMS進行中轉的。接口中每個方法的注釋已經描述得很清楚了,這里就不再贅述了。
1.向AS發送自定義信息
IPlatformCustomizeService接口的BroadcastInCluster、SendToServer、QueryServer方法用于發送自定義信息或同步調用給AS,那么AS如何來處理這些信息了?
AS需要實現ESPlatform.Server.Application. ICallbackHandler 接口來處理來自群集外部的信息。
ICallbackHandler接口的三個方法剛好對應 IPlatformCustomizeService接口的三個方法。我們在實現了ICallbackHandler接口后,可以將其實例注入到ESPlatform.Rapid.RapidServerEngine的CallbackHandler屬性上。如此,當AS接收到自定義信息時,便會回調ICallbackHandler對應的方法來處理了。
2.向客戶端發送自定義信息
同樣的問題,IPlatformCustomizeService接口的SendToClient、QueryClient方法用于發送自定義信息或同步調用給某個在線的客戶端,那么客戶端如何來處理這些信息了?實際上,客戶端不需要實現新的接口,而是通過ICustomizeHander接口來統一處理。無論是來自AS的信息,還是來自群集外部的信息,都將有ICustomizeHander接口來處理。關于ICustomizeHander接口的詳細介紹,可以參見 ESFramework 開發手冊(01) -- 發送和處理信息 。
要注意的是,在分配信息類型informationType時,來自群集外的自定義信息不要與普通的自定義信息的類型重復就可以了。
三.例子
下面我們舉個簡單的例子,來說明外部系統與ESPlatform群集的交互。
我們假設有個簡單的在線的網絡游戲系統,由B/S和C/S兩個子系統組成。B/S子系統用于實現像用戶注冊、資料修改、后臺管理等業務功能;C/S子系統則用于實現所有的游戲邏輯,由于在線用戶數量巨大,所以我們使用了ESPlatform群集平臺。整個系統結構簡化后如下圖所示:
下面我們舉兩個常見的需求。
1.修改游戲配置參數
為了方便游戲管理員GM的操作,我們的B/S子系統提供了后臺網站給管理員進行重要的游戲參數設置。比如,像游戲中的金融平衡系數等,這些參數的值必需提交給每個AS生效才可以。對于類似的需求,可用類似如下的流程實現:
(1)GM通過后臺網站將修改參數的請求提交給Web。
(2)Web再向BL提交。
(3)BL修改DB(如果需要的話)成功后,發送自定義信息給ACMS。(通過IPlatformCustomizeService接口的BroadcastInCluster方法)
(4)ACMS在群集中廣播自定義信息。
(5)每個AS都將回調上述ICallbackHandler接口的HandleBroadcast方法來使參數設定生效。
2.充值
充值功能一般在Web中完成,而在線的客戶端卻要實時顯示最新的余額信息。類似這樣的流程也很容易實現:
(1)玩家通過前臺網站將充值請求提交給Web。
(2)支付成功后,Web向BL提交。
(3)BL修改DB成功后,發送自定義信息給ACMS。(通過IPlatformCustomizeService接口的SendToClient方法)
(4)ACMS根據玩家的ID找到其所在的AS,然后將信息轉發給該AS。
(5)AS收到自定義信息后,在將其轉發給目標玩家的客戶端。
(6)客戶端收到自定義信息后,更新內存中的最新余額信息,并更新UI顯示。
為了方便討論,我們這里對舉例的場景做了很多簡化,真正的系統通常要比這里描述的復雜很多。比如,ACMS可能需要訪問數據庫,而AS可能需要訪問BL或者緩存服務器,等等。這些擴展設計該如何做,取決于我們實際的項目需求。后續的文章,我們將更深入地討論ESPlatform群集系統與外部的交互,不僅僅外部主動調用群集系統,群集系統也可以主動與外部系統通信。
-----------------------------------------------------------------------------------------------------------------------------------------------
關于ESFramework的任何問題,歡迎聯系我們:
電話:027-87638960
Q Q:372841921
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
