隨著暴雪大概率推出國內市場,將會有很多外服MMO網游填補市場空缺,那么要建立完全滿足用戶流暢訪問的游戲,對在線游戲服務器有哪些要求,需要注意什么?下面就來簡單介紹一下
由于大型多人在線游戲服務器理論上需要支持無限多的玩家,所以對服務器端是一個非常大的考驗。服務器必須是安全的,可維護性高的,可伸縮性高的,可負載均衡的,支持高并發請求的。面對這些需求,我們在設計服務器的時候就需要慎重考慮,特別是架構的設計,如果前期設計不好,最后面臨的很可能是重構。
一款游戲服務器的架構都是慢慢從小變大的,不可能一下子就上來一個完善的服務器構架,目前流行的說法是游戲先上線,再擴展。所以說我們在做架構的時候,一定要把底層的基礎組件做好,方便以后擴展,但是剛開始的時候留出一些接口,并不實現它,將來游戲業務的發展,再慢慢擴展。當然,如果前期設計的不好,后期業務擴展了,但架構沒辦法擴展,只能加班加點搞了。
面對龐大的數據量我們想到的唯一個解決方案就是分而治之,即采用分布式的方式去解決它。把緊湊獨立的功能單獨拿出來做。分擔到不同的物理服務器上面去運行。而且做到可以動態擴展。這就需要我們考慮好模塊的劃分,盡量要業務獨立,關聯性低。
前期,由于游戲需要盡快上線,開發周期短,我們需要把服務盡快的跑起來,這個時候的目標應該是盡快完成測試版本開發,單臺服務器支持的人數可以稍微低一些,但是當人數暴漲時,我們可以能過多開幾組服務來支持新增漲的用戶量,即可以平衡擴展就可以了。到后期我們再把具體的模塊單獨拿出來支持,比如前期邏輯服務器上包括:活動,關卡,背包,技能,好友管理等。后期我們可以把好友,背包管理或其它的單獨做一個服務進程,部署在不同的物理服務器上面。我們先按分區的服務進行設計,后面在部署的時候可以部署為世界服務器,下面是一個前期的架構圖,下面我們從每個服務器的功能說起:
1,登陸管理服務
負責用戶的登陸驗證,如果有注冊功能的話,也可以放在這里。一般手機游戲直接走sdk驗證。網頁游戲和客戶端游戲會有注冊功能,也可以叫用戶管理服務。
1.1 用戶登陸驗證?負責接收客戶端的用戶登陸請求,驗證賬號的合法性,是否在黑名單(被封號的用戶),是否在白名單(一般是測試賬號,服務未開啟時也可以進入)。如果是sdk登陸,此服務向第三方服務發起回調請求。
1.2 登陸安全加密?使用加密的傳輸協議,見通信協議部分。
1.3 是否在白名單內?白名單是給內部測試人員使用的,在服務器未開啟的狀態下,白名單的用戶可以提前進入游戲進行游戲測試。
1.4 判斷是否在黑名單?黑名單的用戶是禁止登陸的,一般這是一些被封號的用戶,拒絕登陸。
1.5 登陸驗證?服務器使用私鑰解密密碼,進行驗證,如果是sdk登陸,則直接向第三方服務發起回調。
1.6 登陸令牌(token)生成?當用戶登陸驗證成功之后,服務器端需要生成一個登陸令牌token,這個token具有時效性,當用戶客戶端拿到這個token之后,如果在一定時間內沒有登陸游戲成功,那么這個token將失敗,用戶需要重新申請token,token存儲在登陸服務這,向外提供用戶是否已登陸的接口,其它服務器想驗證如果是否登陸,就拿那個服務收到的token來此驗證。
1.7 顯示用戶角色信息?當用戶登陸成功之后,顯示最近登陸的角色信息。
2,顯示公告
用戶登陸成功之后,請求公告服務器,獲取最新的公告,公告服務先根據token和Userid驗證用戶是否已登陸,公告有可能根據渠道的不同,顯示不同的公告。所以 公告一定是要可以根據渠道編輯的。
3,選區服務
當用戶登陸成功之后,請求服務器分區列表服務器,顯示當前所有的大區列表。
3.1 驗證用戶是否已登陸?向登陸服務器請求驗證是否已登陸。
3.2 大區列表顯示?大區列表信息中只顯示大區id和大區名稱。這樣做是為了安全考慮,不一次性把大區對應的網關ip和端口暴露出來,也可以減少網絡的傳輸量。
3.3?用戶點擊選擇某個大區,客戶端拿到大區id再向選區服務請求獲取此大區對應的網關ip地址和端口。根據負載算法計算得出。
3.4 網關的選擇?選區服務會維護一份網關的配置列表。一個大區對應一到多個網關,當配置有多個網關時,需要定時檢測各個網關是否連接正常,如果發現有網關連接不上,需要把大區對應的網關信息設置為無效,不再參與網關的分配,并發出報警。 一般對于網關的選擇,可以使用用戶id求余法加虛網關節點法。這樣在網關節點數量固定的情況下,一個用戶總是會被分配到同一個網關上面。但是如果只是使用求余法的話,可能會造成用戶分布不均衡,這里可以通過增加網關的虛擬節點(其它就是增加某個網關的權重,讓用戶多來一些到這個網關上面),這個可以參考哈稀一致性算法。包括后面說到的一個網關對應多個邏輯服務器,也可以使用同樣的方法。這部分可以抽象出來一個模塊使用。
3.5?選區服務對內要提供修改服務器狀態的接口,比如維護中…
4,登陸網關
4.1 建立連接?收到客戶端的建立連接請求之后,記錄此channel和對應的連接建立時間。并設置如果在一定時間內未收到登陸請求,則斷開連接。返回給客戶端登陸超時。