目前幾個產品在服務端的總體架構都是類似的,如下圖;由於歷史原因,在不同的產品里面,各類服務器具體的名字可以有所差異:

主站和榜單
左上方是http通信的服務器,有兩個服務,一個是主站(承載的客戶端登錄、支付,以及部分運營推廣的功能);一個是榜單服務器,不斷刷新各類榜單,並直接為客戶端提供服務。
網關和玩法
左下方是網關服務器,負責與客戶端的socket通信,背后是各種玩法服務器,以及大廳。 玩法服務器就是提供給類玩法的,比如斗地主、捕魚、炸金花等;在老的棋牌產品里面,每個玩法會獨占一台服務器;在新的麻將產品里面,已經改造成插件式的。
大廳
大廳服務器是從主站里面剝離出來的,把和游戲主體部分,和玩法無關的功能放到了大廳里面,比如用戶的信息、簽到、郵件等等;一方面簡化主站,另一方面通過socket通信速度也更快一些。
大廳是一個“半有狀態”服務,一方面大廳會在內存里面緩存一些用戶信息,另一方面也可以隨時重啟,能夠自動重建這些緩存。
存儲
右側是我們目前使用的兩種存儲方式,數據庫mysql,緩存redis;持久化數據都是放在mysql里面的,redis是一個高速緩存備份。
目前我們沒有獨立的存儲服務,各個功能模塊會直接訪問redis和mysql,並負責兩者之間的同步,這可以算是當前架構的一個缺陷,所以開發人員要特別注意這一點,做好redis數據的過期以及讀寫優化。
但是建立獨立的存儲服務器,也有一個隱患,因為棋牌是不分服,一旦用戶量多了,redis可以擴展為集群,存儲服務器要自建集群的話,難度可能較大。
總體上存儲這塊的設計目前可用,但不夠好。
