前言:
最近研究了一些遊戲服務器的架構和實現, github上找了幾個開源的實現. 有幾個感受不錯, 打算仔細研讀一下.
遊戲服務器種類繁多, 這邊主要是基於狀態同步的棋牌類遊戲, 適合入門, ^_^.node
研究案列:
cashino-server(git地址, 請點擊這裏)這個項目好像是中國人寫的, 從文檔和提交者能夠略見端倪, 代碼是基於nodejs實現, 後端惟一的中間件是redis.
項目很是的強大, 能夠說實現了一個分佈式的版本, 可擴展性強. 添加新的棋牌遊戲, 按照固定的套路實現便可. 當前主要實現了2款遊戲, 德州和炸金花, 基本上是中外人民喜聞樂見的娛樂項目, ^_^.android
解讀架構:
通常的棋牌類遊戲都有一個大廳服務器和具體的遊戲(房間)服務器, 這邊的架構實現也不例外.
其由一個大廳服務器(集lobby, user, gateway), 和具體的遊戲服務(cashino)組成. 整個遊戲服務架構捨棄了常規的服務註冊定位和路由模式, 巧妙地借用發佈訂閱模式來實現整合. 房間用戶數據實時落中心化的存儲. 客戶端再也不須要另起socket直連房間服務, 大廳服務自己能夠無狀態多節點部署. 固然這一切都是redis的功勞, 或者說項目做者對redis的魔性使用.
ios
login server和game server之間, 再也不有http/rpc的直接交互, 只有藉助redis隊列實現的發佈訂閱關係. 這就是這個項目和其餘常規棋牌類遊戲服務架構的最大不一樣.git
淺談消息機制:
客戶端(h5, android/ios)和login server是基於websocket構建的長連接, 後續的消息交互都是經過login server中轉.
而服務內部其消息通信機制, 正如上圖的構建中, 全經過訂閱/發佈的消息隊列來實現的.
玩家發往房間的消息, 是經過login server節點, 往房間相關的隊列推送消息, 對應的game server節點會消費並處理消息. 反之房間發送給玩家的信息, 則往用戶對應的隊列推送消息, 對應的login server節點會接受, 並同步返回給玩家.
login server和game server彼此沒有直接交互, 並且登錄於不一樣login server節點的玩家, 也能在同一個房間一塊兒玩. github
總體評價:
cashino-server寫於3年前, 應該仍是屬於研究試驗型的階段, 沒有經歷過真正商業化的考驗.
架構上有它首創的一面, 巧妙地利用發佈訂閱的模式, 解決了內部交互的複雜度. 同時該設計對擴展友好, 能夠很是方便擴展新的遊戲(房卡模式的棋牌類), 只須要關注遊戲自己邏輯就行.web
總結:
後續會再寫幾篇文章, 更加深刻去研究剖析下該項目, 希翼從中獲取更多的知識.redis