Pomelo雜記(二)

1、訪問後端服務器handler
-------------------------------------

客戶端也可以直接調用後端服務器的handler,但是內部實際上是先連接到前端服務器,在components/server.js中執行

app.sysrpc[routeRecord.serverType].msgRemote.forwardMessage

通過rpc調用後端服務器的forwardMessage方法(/game-server/node_modules/pomelo/lib/common/remote/backend/msgRemote.js),在forwardMessage方法中重新調用後端服務器的

server.handle方法以調用客戶端的目標方法.

frontend服務器forward消息的地方在:
https://github.com/NetEase/pomelo/blob/master/lib/server/server.js#L178

backend服務器接收消息的地方在:
https://github.com/NetEase/pomelo/blob/master/lib/common/remote/backend/msgRemote.js#L20

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

2、rpc調用
-------------------------------------

pomelo 是一個多進程相互協作的環境,rpc服務,讓frontend 能夠調用backend 的方法

self.app.rpc.chat.chatRemote.add(session, uid, self.app.get('serverId'), rid, true, function(users){
        
    next(null, {
            
        users:users
        
    });
    
});

rpc調用傳遞的第一個參數session,主要用於計算出路由,以確定請求要發到哪臺服務器,也就是說第一個參數只用來route,所以不一定需要傳遞session對象(可以是其他值),

路由設置app.route('chat', routeUtil.chat);參見routeUtil,此參數在remote裏面是沒有接收的。

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

3、廣播channel

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

Channel是服務器端向客戶端推送消息的通道。Channel可以看成一個玩家id的容器,通過channel接口,可以把玩家id加入到channel中成爲當中的一個成員。之後向channel推送消

息,則該channel中所有的成員都會收到消息。Channel只適用於服務器進程本地,即在服務器進程A創建的channel和在服務器進程B創建的channel是兩個不同的channel,相互不影

響。

chanelService保存自定義的頻道名,每個頻道里保存前端服務器的ID:sid和每個用戶的ID:uid在groups,groups[sid]取得所有通過同一個前端服務器登陸的uid。

0.5版本後加入了globalChannel,它提供全局的channel服務,其默認實現是通過redis將相關信息存儲,開發者可以根據自身需求開發其它實現;Pomelo原有的channelService只能在具體某個服務器中創建channel,這種channel只能存儲該服務器的用戶信息,而globalChannelService則可以創建全局的globalChannel,所有服務器的用戶信息都可以通過globalChannel進行存儲。

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

4、通信加密

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

目前,pomelo通訊數據時沒有進行加密的,通信數據需自行加密,當然如果使用protobuf也等於加密了數據

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

5、async控制流

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

異步的機制決定,pomelo裏面要涉及到工作流控制,一般使用async控制流,常見方法如下

1.parallel方法是並行執行一組異步函數,這些函數之間沒有順序上的差異,如果其中一個返回err,則最終的callback返回err 和每個函數返回值組成的數組。

2.series方法是順序執行一組異步函數,每個函數必須在上個函數執行完纔開始執行,如果其中一個返回err,則之後的函數不在執行,並且最終的callback會立刻並返回err.

3.waterfall方法和series一樣都是順序執行一組異步函數,不同的是每個函數執行完畢須把結果傳遞給下個函數,下個函數可能對上個函數的結果有依賴。

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章