網遊伺服器系列之二 常用的網遊伺服器集群設計

2021-05-23 13:37:51 字數 2251 閱讀 1665

兩面人原創,csdn 首發

網遊伺服器集群設計至少需要達到以下目標:

既定的硬體配置下能夠盡可能支援更多的使用者

使用者的響應延遲盡量要小,一般而言,對於rpg類遊戲非戰鬥情況下延遲應低於500ms,pve戰鬥情況下要低於300毫秒,pvp戰鬥下應低於200毫秒。對於格鬥類遊戲,延遲要求應該更小。

很少的硬體下也能部署出完整的系統,負載要求提高時可以通過新增硬體來提高負載能力。但硬體投入的增加和負載能力的增長應該是線性關係。

另外由於現在的伺服器多核cpu,四核已近非常普及,很快八核乃至更多核心的cpu也會普及,所以伺服器集群設計時也要考慮充分利用多核cpu的處理能力。

目前大多數網路遊戲都會採用類似圖1的集群設計方案。伺服器分為前端連線服務組和後端功能伺服器組。

圖1常用的網遊伺服器集群設計

這樣設計有幾點好處。

首先是客戶端和伺服器集群之間只需要維護乙個連線。網遊伺服器和web應用的伺服器是有很大差別的,使用者使用web服務的過程是由一次次的http請求完成的,這些請求都是採用的tcp短連線。而且這些請求都只需指向一台web伺服器,即使伺服器使用多台web伺服器分擔負載,同乙個使用者在一次會話中的所有請求也必須被負載均衡器指派到同一臺web伺服器。而網路遊戲(webgame除外)一般採用c/s結構,客戶端和伺服器之間是長連線。遊戲過程中玩家會從乙個地圖走到另乙個地圖,會進入副本戰鬥,結沒有束后回到主城,這些行為都可能導致使用者會使用不同的功能伺服器的服務。如果沒有連線伺服器,客戶端就有可能會和很多的功能伺服器連線,甚至是同時和多個功能伺服器連線。這樣客戶端就要實現連線管理,多個連線也使客戶端處理網路錯誤(比如判斷是否掉線)帶來麻煩。對伺服器而言,

第二個好處就是在伺服器端可以把大量併發連線的資料收發操作和遊戲邏輯的處理分開。在網路程式設計中,大量併發連線的處理一直以來都是難點中的難點。很多設計模式專門來解決這個問題。各個作業系統也持續的在核心中針對性的提高併發連線處理的能力,並提供相應的api。基本上各個作業系統都都提供了非同步i/o的程式設計介面。windows下的iocp,linux的epoll,freebsd 的kqueue。即使採用非同步i/o機制,大量併發連線的處理對cpu資源的消耗也是比較大的。連線伺服器專注於處理併發連線,可以讓功能伺服器專注於邏輯處理。每個功能伺服器的本職工作應該是高效的的處理遊戲邏輯,如果所有的功能伺服器都要處理大量的併發連線對伺服器的處理效率會有較大影響,同時所有功能伺服器都暴露在公共網路也是不小的安全隱患。

那麼一台連線伺服器應該能支援多少併發連線呢?我們知道連線伺服器的功能僅僅只是資料**,它做的工作比絕大多數http server 做的都簡單。那麼如果設計得好,它的併發能力不應該低於主流的http server。常用的apache server 一般支援5000個併發連線沒有問題,優化一下配置,最好再調整一下linux核心引數,可以支援到一萬以上。更輕量級的nginx

號稱可以支援到5萬以上。而實際上大多數網遊的連線伺服器能支援的數量卻少的可憐,一般1000是及格,2000是優秀,3000以上就很難得了。

為什麼這麼低呢?主要原因有兩點。

第乙個原因是由網路遊戲(尤其是mmorpg)的資料通訊特點導致的。前一篇文章中我已經提到了網遊有非常大量的下行廣播資料。任何乙個玩家做出乙個動作(走跑跳、攻擊等等),都需要伺服器廣播給周圍的所有玩家,同時這個動作所造成的場景中的其他變化也需要立即廣播出去。玩家聚集得越集中,廣播量就越大,而且這個增長之間是指數關係。假如功能伺服器需要把乙個資料廣播給周圍30個人,為了減少功能伺服器的資料傳送量,它發到連線伺服器的是這30個人的列表和實際的資料內容。連線伺服器就要負責分別傳送給30個人。所以廣播壓力主要是集中在連線伺服器。而且從遊戲設計和運營的角度上講,現在的網遊越來越傾向於把玩家通過工會戰、戰場等活動聚集起來,人多才好玩嘛。這是與一般web 應用相比的乙個很大差別。因此連線伺服器支援的併發連線數遠遠不能和主流的http server相比。

另乙個原因是tcp的傳輸機制。絕大部分遊戲客戶端和伺服器都是採用tcp連線,好處是資料傳輸可靠,程式設計也方便。但是對於大量的廣播報文而言,tcp的可靠性卻導致的傳送效率低下。實際上廣播報文中的70%都是玩家(以及npc)位置的同步資料,這些資料其實不需要很高的可靠性,即使丟了乙個資料報,過一會就會收到下乙個新位置的資訊,客戶端只需要平滑處理一下就可以掩飾得很好。

廣播效率上不去對遊戲伺服器的負載能力的影響非常大。廣播不出去的資料就會累積在連線伺服器上,導致連線伺服器的記憶體無限增長,同時客戶端的響應延遲也增加,玩家就會感覺很卡。解決的辦法要麼降低每組伺服器的人數,要麼多加連線伺服器。實際上多數網遊就是這麼做的。這樣連線伺服器的主要作用到不是分擔併發連線,而是分擔廣播壓力,似乎改個名字叫廣播伺服器更合適一些。

通用網遊伺服器

通用網遊伺服器是適用於一類網遊的伺服器,如rpg網遊伺服器.通用伺服器提供的是適用於該類網遊的機制,與內容無關.特定於某乙個遊戲的內容由指令碼和配置檔案實現.目前在指令碼機制不完善的情況下,可以把特定的遊戲內容分離到動態鏈結庫中,實現機制與內容分開.這個通用的網遊伺服器還可以分成兩個部分 1.核心,...

通用網遊伺服器

通用網遊伺服器是適用於一類網遊的伺服器,如rpg網遊伺服器.通用伺服器提供的是適用於該類網遊的機制,與內容無關.特定於某乙個遊戲的內容由指令碼和配置檔案實現.目前在指令碼機制不完善的情況下,可以把特定的遊戲內容分離到動態鏈結庫中,實現機制與內容分開.這個通用的網遊伺服器還可以分成兩個部分 1.核心,...

網遊伺服器設計原則幾條

1.server間socket的傳送和接收快取要足夠大,以防在客戶端併發操作時訊息堆積導致的溢位 2.server端在最有可能大併發量的accept和disconnect操作上做排隊處理,防止此種情況下導致server壓力突增 3.server上對每個客戶端做訊息傳送頻率的限制,以防惡意攻擊 4.維...