日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

ESPlatform 群集平臺(02) -- 從外部訪問群集

系統(tǒng) 2048 0

本文我們來解決一個常見的問題,那就是在ESPlatform群集之外如何訪問和控制ESPlatform群集了?

ESPlatform 群集平臺(01) -- 遷移到群集平臺 一文中,我們提到ACMS提供了三個Remoting服務接口:IApplicationService、IClusterControlService、IPlatformCustomizeService。 IApplicationService我們已經(jīng)介紹過了,而 IClusterControlService 和 IPlatformCustomizeService 正是ESPlatform群集系統(tǒng)提供給外部系統(tǒng)(如BL)來訪問或控制群集的。

ESPlatform 群集平臺(02) -- 從外部訪問群集

通常我們會這樣做,將ACMS暴露的 IClusterControlService 和 IPlatformCustomizeService作為群集系統(tǒng)對外暴露的唯一通道,外部系統(tǒng)只能通過ACMS提供的這兩個接口與整個群集系統(tǒng)通信。外部系統(tǒng)不要直接與某個AS通信,除非我們有充分的理由,否則,不要輕易破壞這一規(guī)則。這一規(guī)則的目的在于,盡可能使整個系統(tǒng)(可能是很龐大的、復雜的)保持簡潔的、清晰的結構。

一.IClusterControlService接口

IClusterControlService接口用于訪問群集系統(tǒng)中的AS服務器信息或控制群集中的服務器。IClusterControlService的定義如下:

1.AS基礎信息與事件

當我們動態(tài)地向群集中添加一臺AS時,ACMS將會觸發(fā)IClusterControlService接口的ServerRegistered事件;同樣的,當動態(tài)地從群集中移除一臺AS時,將觸發(fā)IClusterControlService接口的ServerUnregistered事件。請注意,如果某臺AS意外掛掉,則ACMS是不知情的,我們必需手動調用IClusterControlService接口的RemoveServer方法,此方法的執(zhí)行仍然會觸發(fā)IClusterControlService接口的ServerUnregistered事件。

GetServer用于獲取群集中某臺AS的詳細信息,其返回的ClusterServerInfo類圖如下:

ESPlatform 群集平臺(02) -- 從外部訪問群集

通過返回的ClusterServerInfo,我們可以知道目標AS基本信息:啟動時間、IP端口地址、在線用戶數(shù)量、當前的CPU使用率、內存使用率、是否處于凍結狀態(tài)。

2.群集分配策略

所謂群集分配策略,就是當一個客戶端要連接到AS時,我們應該分配群集中的哪臺AS給他?選擇AS所采取的策略就是群集分配策略。

AS內置了三種常見的群集分配策略:輪詢、人數(shù)最少、CPU利用率最小。該策略由ServerAssignedPolicy枚舉定義:

在ACMS的配置文件ESPlatform.ACMServer.exe.config中,有key為ServerAssignedPolicy的配置項,我們可以在此指定所采用的AS分配策略。

IClusterControlService接口的GetServerToLogon方法將依據(jù)ServerAssignedPolicy的設置返回恰當?shù)腁S。

當我們想讓某臺AS不再接受新的客戶端連接時,可以調用FreezeServer方法來凍結它。當AS被凍結后,GetServerToLogon方法將永遠不會返回這臺AS。

當然,我們也可以完全自己定義AS的分配策略,而忽略ACMS提供的內置的分配策略的存在。

假設我們已經(jīng)采用了ACMS內置的分配策略或實現(xiàn)了自定義的分配策略,那么,客戶端如何知道自己要登錄到哪個AS了?需要有個第三方來提供這一查詢服務。我們可以簡單地做到這一點,比如,發(fā)布一個WebService,客戶端先通過訪問該WebService獲取要登錄的AS的地址,然后再去連接目標AS,等等。

二.IPlatformCustomizeService 接口

如果,希望從外部發(fā)送一個指令給群集中的某臺AS或在線的某個客戶端,該如何做了? 我們可以使用ACMS暴露的IPlatformCustomizeService接口。

就像ESPlus提供的自定義信息功能一樣,我們可以從群集外部通過IPlatformCustomizeService接口發(fā)送自定義信息甚至同步調用給某個AS或某個在線客戶端,當然,這些信息都是經(jīng)過ACMS進行中轉的。接口中每個方法的注釋已經(jīng)描述得很清楚了,這里就不再贅述了。

1.向AS發(fā)送自定義信息

IPlatformCustomizeService接口的BroadcastInCluster、SendToServer、QueryServer方法用于發(fā)送自定義信息或同步調用給AS,那么AS如何來處理這些信息了?

AS需要實現(xiàn)ESPlatform.Server.Application. ICallbackHandler 接口來處理來自群集外部的信息。

ICallbackHandler接口的三個方法剛好對應 IPlatformCustomizeService接口的三個方法。我們在實現(xiàn)了ICallbackHandler接口后,可以將其實例注入到ESPlatform.Rapid.RapidServerEngine的CallbackHandler屬性上。如此,當AS接收到自定義信息時,便會回調ICallbackHandler對應的方法來處理了。

2.向客戶端發(fā)送自定義信息

同樣的問題,IPlatformCustomizeService接口的SendToClient、QueryClient方法用于發(fā)送自定義信息或同步調用給某個在線的客戶端,那么客戶端如何來處理這些信息了?實際上,客戶端不需要實現(xiàn)新的接口,而是通過ICustomizeHander接口來統(tǒng)一處理。無論是來自AS的信息,還是來自群集外部的信息,都將有ICustomizeHander接口來處理。關于ICustomizeHander接口的詳細介紹,可以參見 ESFramework 開發(fā)手冊(01) -- 發(fā)送和處理信息

要注意的是,在分配信息類型informationType時,來自群集外的自定義信息不要與普通的自定義信息的類型重復就可以了。

三.例子

下面我們舉個簡單的例子,來說明外部系統(tǒng)與ESPlatform群集的交互。

我們假設有個簡單的在線的網(wǎng)絡游戲系統(tǒng),由B/S和C/S兩個子系統(tǒng)組成。B/S子系統(tǒng)用于實現(xiàn)像用戶注冊、資料修改、后臺管理等業(yè)務功能;C/S子系統(tǒng)則用于實現(xiàn)所有的游戲邏輯,由于在線用戶數(shù)量巨大,所以我們使用了ESPlatform群集平臺。整個系統(tǒng)結構簡化后如下圖所示:

ESPlatform 群集平臺(02) -- 從外部訪問群集

下面我們舉兩個常見的需求。

1.修改游戲配置參數(shù)

為了方便游戲管理員GM的操作,我們的B/S子系統(tǒng)提供了后臺網(wǎng)站給管理員進行重要的游戲參數(shù)設置。比如,像游戲中的金融平衡系數(shù)等,這些參數(shù)的值必需提交給每個AS生效才可以。對于類似的需求,可用類似如下的流程實現(xiàn):

(1)GM通過后臺網(wǎng)站將修改參數(shù)的請求提交給Web。

(2)Web再向BL提交。

(3)BL修改DB(如果需要的話)成功后,發(fā)送自定義信息給ACMS。(通過IPlatformCustomizeService接口的BroadcastInCluster方法)

(4)ACMS在群集中廣播自定義信息。

(5)每個AS都將回調上述ICallbackHandler接口的HandleBroadcast方法來使參數(shù)設定生效。

2.充值

充值功能一般在Web中完成,而在線的客戶端卻要實時顯示最新的余額信息。類似這樣的流程也很容易實現(xiàn):

(1)玩家通過前臺網(wǎng)站將充值請求提交給Web。

(2)支付成功后,Web向BL提交。

(3)BL修改DB成功后,發(fā)送自定義信息給ACMS。(通過IPlatformCustomizeService接口的SendToClient方法)

(4)ACMS根據(jù)玩家的ID找到其所在的AS,然后將信息轉發(fā)給該AS。

(5)AS收到自定義信息后,在將其轉發(fā)給目標玩家的客戶端。

(6)客戶端收到自定義信息后,更新內存中的最新余額信息,并更新UI顯示。

為了方便討論,我們這里對舉例的場景做了很多簡化,真正的系統(tǒng)通常要比這里描述的復雜很多。比如,ACMS可能需要訪問數(shù)據(jù)庫,而AS可能需要訪問BL或者緩存服務器,等等。這些擴展設計該如何做,取決于我們實際的項目需求。后續(xù)的文章,我們將更深入地討論ESPlatform群集系統(tǒng)與外部的交互,不僅僅外部主動調用群集系統(tǒng),群集系統(tǒng)也可以主動與外部系統(tǒng)通信。

閱讀 更多ESFramework開發(fā)手冊系列文章

-----------------------------------------------------------------------------------------------------------------------------------------------

關于ESFramework的任何問題,歡迎聯(lián)系我們:

電話:027-87638960

Q Q:372841921





ESPlatform 群集平臺(02) -- 從外部訪問群集


更多文章、技術交流、商務合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 临桂县| 县级市| 利辛县| 高州市| 兴安盟| 桂平市| 高尔夫| 湟源县| 连云港市| 平阳县| 明溪县| 满城县| 乡宁县| 高陵县| 祁阳县| 瑞金市| 略阳县| 广东省| 平谷区| 仪陇县| 泸定县| 霍邱县| 五华县| 云浮市| 图们市| 兴文县| 攀枝花市| 色达县| 墨脱县| 三河市| 图们市| 盘山县| 文成县| 沭阳县| 循化| 高安市| 霸州市| 高台县| 海丰县| 通河县| 安岳县|