基於滴滴雲的棋牌遊戲服務端架構設計

java06051515發表於2018-11-27

現在小團隊開發的棋牌遊戲有很多,棋牌行業的相互攻擊是非常普遍的現象,同行之間往往會採取 DDOS、CC 等攻擊的手段來打擊對手,這是目前棋牌運營商們面臨的比較嚴峻的一個問題,那麼在設計棋牌遊戲服務端架構時就需要考慮高可用和抗攻擊這兩個特性,本文詳細介紹瞭如何基於 滴滴雲 現有的產品組合來設計一套高可用的抗攻擊架構。

需要解決的技術點

1. 資料共享

由於棋牌類遊戲的資料少,計算量不大,所以完全可以不使用記憶體快取,而直接使用 redis 共享記憶體。使用者的所有資料都快取在 Redis 中,更新也同步到 Redis 中,這樣一個使用者不管登陸到哪一臺業務伺服器,都能獲得自己最新的資料。

2. 負載均衡

因為棋牌類遊戲不分割槽不分服,在設計伺服器的時候,是按世界服的思想去設計,即伺服器是一個 n 多臺物理機的叢集。當使用者登陸伺服器建立房間時,可能根據負載均衡演算法,它可以在任何一臺伺服器上面。

3. 抗攻擊

針對可能發生的  以及 ,可以考慮購買DDOS高防以及Web應用防火牆。

4. 長短連線

考慮到伺服器的負載情況以及使用者的狀態變化,在使用者未進入遊戲之前可以採用短連線,進入遊戲狀態之後採用長連線狀態。

系統架構

1. 登入伺服器

登入伺服器一般需要實現如下的功能:

  • 登入,一般都是需要接第三方登陸,登陸這一塊是 HTTP 操作,可以統一提供一個Web服務,用來做登陸驗證。因為在登陸時,呼叫第三方的 HTTP 服務,這個過程可能很慢,如果放在邏輯伺服器的話,可能會卡業務邏輯任務。因為不同的玩家業務請求可能在同一個執行緒中,如果有任務卡了,那麼這個任務以後新來的請求都會卡住,導致訊息延遲。


  • 獲取遊戲公告,也放在 Web 服務中。公告一般是遊戲登陸的時候向伺服器獲取一次。把它放在 Web 伺服器中,與業務邏輯分離的好處是,當業務邏輯伺服器維護或更新的時候,不影響使用者的登陸,和獲取公告,這樣使用者體驗會好一些。


  • 建立使用者唯一的 ID,因為棋牌類遊戲伺服器是世界服,無分割槽,所以使用者的 ID 必須是全域性唯一的。可以利用 Redis 的 incr 方法原子的遞增,如果不想被別人根據 userid 的遞增推算出有多少註冊使用者,遞增的梯度可以隨機,比如每次遞增的值從 1 到 1024 中的隨機一個。

2. 大廳伺服器

大廳伺服器實現如下功能:

  • 建立房間,當房間主建立房間時,房間可以建立在下游的任意一臺業務伺服器上,這裡面可以做一些負載均衡策略,給使用者返回房間具體落得伺服器資訊,使得玩家可以登入房間。


  • 查詢加入房間,根據房間 ID 查詢房間,查詢到房間後,獲取房間所在的 IP 地址或伺服器 ID,把這個房間所在的 IP 和埠返回給客戶端,讓客戶端重新與房間所在的伺服器建立連線,使用登陸時的 token 驗證使用者。

3. 業務伺服器

業務伺服器實現如下功能:

  • 玩家同屏,玩家同屏是棋牌遊戲中的一個重點,對於做過那些大型的 ARPG,或 MMO 遊戲的程式設計師來說,這並不是什麼難事。因為同屏就是伺服器對客戶端的訊息進行轉發。一個房間四個人,一個人出的牌或操作能被其他三個人同時看到。常用的方式有客戶端主動拉取和服務端主動推送方式。


  • 訊息保序,建立房間成功之後,接下來的操作都要保證它的順序性,所以房間需要有一個它自己的訊息佇列。我們可以把每個房間到達伺服器的訊息封裝為一個任務,把這個任務放到訊息佇列中,然後有一個任務執行者去按順序執行這些任務。


  • 玩家狀態跟蹤,玩家和服務端之間需要有一個連線狀態 Keep Alive 的探測,尤其是在移動客戶端的遊戲版本上,網路連線可能存在不穩定。

其他

很多伺服器的長期使用者應該都知道,我們租用伺服器,不僅要考慮伺服器的配置、機房的防禦、機房的頻寬、機房的環境,還要考慮機房保證的頻寬、機房的後期服務等等,這些都是非常重要的。特別是後期的服務,因為伺服器是需要 24 小時運作的,一旦出現問題不能及時解決的話,對使用者的利益都是有無法估計的損害。

滴滴雲 可以提供上述架構所需要的所有產品,而且價格相對比較低,售後支援及時有保障,是一個可以信賴的選擇。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559758/viewspace-2221623/,如需轉載,請註明出處,否則將追究法律責任。

相關文章