遊戲伺服器與普通伺服器有什麼區別?

相比於我們常見的數據中心的普通web伺服器,遊戲伺服器(如英雄聯盟,魔獸世界)有什麼特別的地方?


朋友里有一位伺服器大牛做過類似的總結,我徵得他的同意把當時的資料分享一下。大量刪節。

文章里說遊戲伺服器比較多,沒怎麼說web伺服器。但是看了之後你就明白Web和遊戲伺服器在並發性方面根本性的不同了。

遊戲伺服器架構通識

· 前言

· 我們將從遊戲伺服器發展的簡單歷程出發,鳥瞰一下目前大多數的遊戲伺服器架構。

· 這裡儘可能的避免陷入細節的技術問題,而是從技術進化的結果狀態,反推原始問題是什麼。希望能通過這個過程,解釋清楚遊戲伺服器是在解決什麼問題,痛點到底在哪裡。

· 一、早期網遊伺服器。

· 蠻荒時期的遊戲伺服器框架我們一筆帶過,那時的遊戲伺服器和一個小Web服務沒有區別。

· 蠻荒時代的伺服器只負責存儲玩家賬號、數據、轉發場景內其他玩家的行為。很多移動、使用技能等關鍵邏輯在伺服器上根本沒有。隨意就能用變速齒輪改變遊戲速度。

· 從傳奇的時代開始,遊戲伺服器就不再是簡單的上傳存檔、下載存檔、訪問頁面而已。遊戲伺服器內部出現了遊戲邏輯,既能用於同步每個玩家看到的世界,又能讓邏輯與客戶端分離,避免早期的網路遊戲那種毫無防範的邏輯體系(對外掛防禦能力為0)。

· 這種架構奇怪的地方是處理網路連接數據傳輸的壓力和邏輯處理的壓力在同一個伺服器上(存儲模塊可能也在同一個進程),就算邏輯處理壓力為0,承載人數也高不到哪去。

· 二、早期遊戲伺服器的改進版本

· 當開發者們有了初步經驗以後,新作品的開發,自然而然的過渡到了如下的形式:

· 遊戲邏輯服務依然是在一台伺服器上,單進程(邏輯處理本身肯定是在一個線程中,可以有子線程負責內網通信)。但是我們自然的想到,存儲負載和網路連接負載可以從邏輯服上拆出來。

· 由於連接伺服器本身沒有時序性,很容易做分散式的(其實大部分遊戲還是只用一個連接服),存儲服務不要求高實時性,高峰期存檔間隔可以稍長一些,不會對遊戲服造成影響。

· 三、成熟形態的伺服器框架(這節是重點)

· 1、邏輯伺服器的負載均攤方法一:按照功能劃分多個伺服器進程

· 2、邏輯伺服器的負載均攤方法二:按照場景劃分多個伺服器進程

· 難點在邏輯的設計上,要像做手術一樣把本來是一體的功能切開,並抽象出若干個API來保持聯繫(伺服器之間是TCP連接)。

· 在分解時,要找聯繫相對最薄弱的環節入手,比如場景和場景之間分開、單獨抽出聊天服務、組隊服務、好友服務。

· 無論如何分解,最終結果只能是有限個服務。而且分解的越細,開發難度就越大。因為跨伺服器邏輯是把簡單的同步邏輯變成了非同步Callback邏輯,而且容易出現時序問題等不易測試的問題。

· 單個場景服務幾乎是無法分解的。分解單個場景難度巨大以至於出現了BigWorld引擎來專門的解決場景分割問題,後面會談到。

· 這種成熟形態的遊戲伺服器已經能滿足現實中99%的頻繁交互類網遊需求,是大型MMO端游、頁游的主流形式。

· 對比Web伺服器

大致只說一點:由於資料庫的存在以及HTTP請求的特性,Web伺服器天生就是並發的,也一直在高並發的路上越走越遠。

· 附:開房間式的網路遊戲

· 開房間式的網路遊戲也是遊戲的一個重要分支,英雄聯盟、DOTA、很多手游例如皇室戰爭、王者榮耀等等。

· 這種遊戲房間之間幾乎沒有交互,只有大廳內有交互,可以理解為原始形態的遊戲伺服器的平行擴展。

· 房間式遊戲擴展難度較小,只是需要根據玩家數量動態擴展遊戲房間的數量、伺服器數量。很像網站的架構。

· 這種遊戲架構最最適合放在雲平台上,設計合理的話,它可能遇到的問題和大型網站幾乎一模一樣。不需要特別的討論它們。

· 只是,畢竟遊戲不都是開房間的玩法。

· 小結:遊戲伺服器框架特點

· 1、真正的數據都在內存中,資料庫性能不那麼重要

· 註:很多大型遊戲採用了共享內存,避免宕機時損失過大。

· 2、單CPU性能比CPU數量重要的多。

· 3、目前有很多遊戲,特別是手游,使用Redis讀寫代替內存讀寫,甚至也有用Mongo的。

· 4、開新服、舊區合服的情況,非常適合雲平台。

· 先進伺服器框架

1、BigWorld。理念過於超前,把並發性做到極致,開發友好度弱到極致,已廢。

2、Skynet。本人強烈推薦,誰學誰知道,除了必須要用lua語言,沒有什麼缺點。

· 聊聊十萬行代碼

· 遊戲伺服器開發速度受美術資源製作速度、客戶端開發速度制約。近幾年我猜測伺服器方面並不會有大的技術革新。

· 遊戲開發未來的趨勢是多元化、低門檻化、大眾化。很長一段時間內BigWorld這種大怪獸級別的引擎不會再崛起。

· 分散式框架的崛起時間點,無論如何,也在VR技術成熟之後了。

遊戲開發上有任何疑問,均可私聊咱進行交流,或訪問咱的主頁皮皮關遊戲開發教育


一般的網站應用程序,是典型的Request-Response模式,通過tcp和伺服器建立一次鏈接,而請求數據和影響數據通過http協議進行組裝,當完成一次交互的時候,伺服器端和客戶端tcp鏈接就會釋放,把伺服器端socket資源留給新的客戶端。通常web程序是比較好擴展的,通過硬體負載均衡和添加web伺服器來實現,這一套方案業界都已經比較成熟了。網遊比較特殊,最大的特點在於客戶端和伺服器端是要進行長連接的,客戶端和伺服器端基本上一直要保持連接,不是典型的Request-Response模式,Client會主動給Server發送數據,Server也可能主動往Client發送數據,生命周期比較長,一次發送的數據量比較小,但是數據交互發送比較頻繁。由於要進行長連接,伺服器端的socket就不能進行復用,單台伺服器處理請求是會有限。用web的方案解決擴展問題,也不太適用。在web程序中,客戶端之間的數據是沒有交互的,所有的數據都是通過web伺服器響應給客戶端,但是網遊伺服器中,每個客戶端的數據的變化,都要通過伺服器端廣播給其他客戶端。所以客戶端會有上限,這也就是為什麼伺服器要進行分區,一個區裡面同時在線人數會有限制。


實名贊同 @DalYz的回答

補充一個資料:

深入剖析MMORPG遊戲伺服器端的設計

 MMORPG不同於其它的區域網的網路遊戲,它是一個面向整個Internet的連接人數過萬的網路遊戲,因此他的伺服器端設計則極為重要

伺服器的基本設置

  在大型網路遊戲里,通常設計為C/S結構,客戶端不再對數據進行邏輯處理,而只是一個收發裝置,從玩家那裡接受到操作信息,然後反饋給伺服器,再由伺服器進行處理後發回客戶端,經客戶端通過圖形化處理,給玩家呈現出一個繽紛的遊戲世界。

  登陸伺服器

  在這裡也可以稱之為連接伺服器,網路遊戲的客戶端一般是連接到這裡,然後再由該連接伺服器根據不同的需要,把遊戲消息轉發給其它相應的伺服器(邏輯和地圖伺服器)也因為它是客戶端直接連接的對象,它同時也負擔了驗證客戶身份的工作。

  地圖伺服器

  在這裡也可以稱之為連續事件伺服器。在這個伺服器里要處理的對象(玩家)所做的動作都是一個連續事件。例如玩家從A點移動到B點,這樣一個動作,需要一定的時間進行移動,因此說移動是一個連續事件。

  邏輯伺服器

  在這裡可以稱之為瞬時事件伺服器,在這個伺服器里,處理對象(玩家)所做的動作均可以在非常斷時間內完成完成。例如玩家從商店購買一瓶葯書,當玩家確認購買後,伺服器先扣除玩家的遊戲幣,然後再把相應的藥水瓶加入玩家的背包里。這2個操作對於伺服器來說,只是2個數字的加減,計算完這兩個數字的加減,這個事件就可以結束了。因此,我們可以說這個事件是一個瞬時事件

伺服器組的改進

  不過在實際應用的過程中,遊戲伺服器的結構要比上面所說的3種服務結構要複雜些,不過也都是在這3種最基本的伺服器架構下進行擴充,擴充的主要是其它輔助功能。在實際應用里可能增加的2種伺服器,資料庫伺服器,計費伺服器,由邏輯伺服器獨立出來的聊天伺服器。

  資料庫伺服器

  資料庫伺服器其實就是專門利用一台伺服器進行資料庫的讀寫操作。這點特別是在大型的網路遊戲里尤為重要。因為在大型網路遊戲里,要處理玩家的數據量非常大,如果不利用專門的伺服器進行處理,很有可能會拖累這個伺服器組。

  計費伺服器

  通常在商業的網路遊戲里出現,用於記錄玩家在線的時間,給收費提供依據,同時也是整個伺服器組裡最重要的部分,一旦出現問題,運營商就不用賺錢了。

  聊天伺服器

  在遊戲里的聊天功能是屬於一種瞬時動作,理論上是放在邏輯伺服器里進行處理。不過在大型網路遊戲里,因為這個部分功能與遊戲里的其它部分聯繫並不緊密,因此可以獨立出來做一個功能伺服器。

伺服器的集群設置

  在大型遊戲的應用過程中,實際需要處理的玩家數量可能過萬,一台普通的伺服器是無法完成所要完成的工作,因此,在實際應用的時候,通常是由一組多台伺服器共同完成一個功能。

  例如地圖伺服器,可以根據需要,把遊戲里所有的地域進行劃分,劃分為N個區域,然後讓這一個區域里發生的事件都用一個特定的伺服器進行處理。這樣做的目的是減少一個伺服器所承擔的計算量,把整個系統組成一個分散式的網路。

  不過這樣做的同時會造成一個麻煩:當一位玩家從區域1,移動到區域2。這個時候,就必須先在伺服器1里把玩家刪除,然後再在區域2里加入玩家。同時需要由伺服器1向伺服器2轉移玩家的數據信息(因為伺服器組在工作的時候,玩家的信息只能保存在當前所在區域的伺服器里),也就是說一旦玩家發生伺服器間區域移動,伺服器端就不可避免的造成數據通訊。因為這種移動並不是有規律的,玩家所在的伺服器都有可能到達其它伺服器。這樣,如果伺服器組裡有N台地圖伺服器,那麼,每個伺服器都可能向其它N-1台伺服器產生連接,總共就可能產生N×N個連接。如此數量連接如果只是使用普通的socket設計,就很有可能會給伺服器通訊間的各種問題所困擾,為此,在商業網路遊戲的伺服器之間,通常都使用成熟的第三方的通訊中間件,如ACE,ICE等作為網路連接的傳輸層。


web伺服器基本是無狀態的.

遊戲伺服器是強狀態的, 耦合自己不說, 還要耦合別人, 別的大區...


最大的區別是,web伺服器每個client都是獨立的,遊戲伺服器不同client是有交互有狀態,會實時地互相影響。這導致很多設計上的差異。

並發架構的影響

在高並發下,對client請求進行負載均衡並不如web那麼簡單,因為client狀態會互相影響,並且可能共享寫數據甚至有時序依賴。大型mmorpg通常是長連接,並發服務數通常要遠小於web伺服器 。根源就是實時性和強交互性的限制,兩者要求越低的遊戲,並發就可以做得越高。

web服務運算較少,io密集,讀多寫少。遊戲服計算和io都密集,讀寫都頻繁

對代碼風格的影響

比如開發web服務,基於nginx的openresty就很好用,利用了Lua的協程和非同步io,寫起來很流暢而不失性能。但用來做遊戲伺服器,協程卻可能是個坑,因為遊戲依賴很多上下文環境,當協程被喚醒時,上下文環境改變,協程的代碼風格很容易用了舊變數導致邏輯錯誤。


做過遊戲伺服器的開發,也做過一般的互聯網伺服器的開發,在我看來兩者的區別主要有兩點.

1)遊戲伺服器比一般的伺服器要保存更多的狀態:玩家的屬性這些自不必說,一般的IM服務也會有,還有一些馬上就會變化的數據,比如某個玩家的生命值,發技能前後的法力值等等,這些值區別於一般的屬性值如名字,ID這些的差異在於,會經常性的變化,還會參與到邏輯的計算中,比如你一個多少等級的玩家吃了什麼東西之後戰力值變化為多少,打在一個多少屬性的玩家身上會不會被他閃避,會不會產生暴擊....

遊戲邏輯中的戰鬥技能計算是很大的一個點,我不太熟悉這塊就不展開多說了.可以看到,遊戲邏輯的CPU計算是非常多的.

2)遊戲服務中,每個玩家不是獨立存在的,而是很有可能會與其他玩家發生狀態的交互,一般的伺服器比如HTTP什麼的,你一個請求過來查你的數據,和別人的請求是獨立的,並沒有什麼交互.

客戶端之間會有交互這一點,舉最簡單的例子,一個人在一個場景裡面說了一句話,那麼同一個屏幕的玩家也需要能夠看到他說的這句話.此時遊戲伺服器就需要判斷,多遠的距離以內的玩家,會認定為是"同屏幕"的玩家,需要向這些玩家廣播這個玩家說的這句話.

這個廣播就比較麻煩了.首先,計算哪些玩家在"同屏幕",就是我們在第一點提到的玩家身上某些經常變化的屬性需要做的運算,在這裡需要根據玩家的坐標,找出來跟在同屏幕的玩家,用到的是AOI的概念,感興趣的可以看看雲風的 BLOG: 開發筆記 (13) : AOI 服務的設計與實現 .另外,找到了這些需要接收這個消息的玩家之後,將消息轉發給它們又是一個IO密集的操作,假如場景中有10個人,那麼一句話就需要同時廣播給另外9個人,假如有100人,1000人呢,量就更大了.所以同樣的一個硬體配置的伺服器,可能跑Nginx可以同時處理上萬的鏈接,但是對於一個遊戲伺服器就只有1,2千了,就是因為遊戲伺服器是一個CPU密集而且IO密集的伺服器類型.


遊戲伺服器跟聊天伺服器類似,伺服器推(Server Push)是一個必不可少的常用操作.

而普通的網站伺服器並不需要伺服器推,也就是不需要廣播操作,基本都是HTTP請求/響應操作.

遊戲伺服器相比聊天伺服器,操作更多,狀態更多.

在一個遊戲房間里,聊天,發發信號只是其中的一個小功能.

戰鬥邏輯,英雄等各種對象在遊戲房間里玩家之間的狀態同步,都是聊天伺服器所沒有的.

遊戲伺服器:CPU密集(Redis:內存狀態值讀寫),網路IO密集(廣播).

網站伺服器:狀態比較少(Redis:會話信息),資料庫IO密集.


沒有本質區別

只是在開發原則上和開發難度上有點差異。而且兩者還是可以相互平衡的

先說開發原則的問題,如果偷懶,或者水平有限,或者歷史包袱沉重,那遊戲伺服器要考慮較多的穩定性和效率的問題,畢竟最偷懶的做法還是所有的狀態在進程內存空間里,如果宕了就沒了,而這樣玩,你能折騰的cpu也沒幾個,沒幾下就到計算上限了

當然了,如果你足夠牛,上面的問題都不是問題,但絕大部分人不得不面對一個和開發通用軟體不同的地方,你沒多少現成的輪子可以用,無論是理論層面的還是工具層面的,畢竟來源的網遊大作好像真不多

其他的,好像真沒什麼區別


視情況而定,弱聯網、短連接,即採用HTTP方式通訊和普通Web伺服器基本沒有區別;強聯網、長連接,即採用Socket方式通訊更注重同步性。其次從連接狀態來看,普通Web伺服器是有求必應,各個客戶端即瀏覽器間是沒有消息傳遞的,都是由伺服器來返回數據,而遊戲伺服器特別是MMORPG這類遊戲每個狀態的變化都需要伺服器廣播給所有客戶端,高並發、高同步是主要特點。


對於許多玩家來說,「角色扮演」(Role Playing,下稱RP)都是一個聽起來有些神奇並且神秘的字眼。顧名思義,角色扮演就是讓你扮演一名真正生活在遊戲中的人物,說著這個人物應該說的話,做著這個人物應該做的事,表現出這樣的一個人物所應該表現出的一切品質和性格。要求玩家的行為符合這些條件的網路遊戲伺服器,即被稱為RP伺服器。

那麼對於一個網路遊戲而言,對於《魔獸世界》來說,RP伺服器到底有何不同,它與PVE,PVP伺服器之間的差別到底在何處呢?

簡單來說,RP伺服器與其它伺服器最大的差別就在於該類伺服器中「角色扮演」的氛圍更加濃厚,在大多RPG類的網路遊戲甚至單機遊戲中,「角色扮演」的環境並不是那麼好,或許你只在某一小段時間內感覺到自己真的是遊戲中的角色。而RP伺服器正是為了讓玩家能夠更好的進行「角色扮演」而開設的伺服器。

在RP伺服器中,所有的玩家都是沖著濃厚的「角色扮演」氛圍而來,每一個玩家都根據《魔獸世界》的背景,自己的種族,職業,來涉定自己在遊戲中的性格,是的,每一個角色都有著自己的性格,言談舉止都體現著角色的個性,在這裡,有著紳士的聖騎士,陰冷孤僻的盜賊,粗狂豪邁的戰士,平衡自然的德魯伊。當然,這一切都不是必須的,因為在RP伺服器中最重要的是你的對角色的理解,以及你的扮演,即使是在陰暗處活動的盜賊也可以表現的像一個優雅的紳士,只要你能夠自圓其說。

RP伺服器與其它伺服器在機制上並沒有任何不同,不同的僅僅是玩家的玩法,選擇在角色扮演伺服器上遊戲,那麼行為和談吐就要像一個生活在魔獸世界中的人物那樣。


硬體上都是普通PC伺服器,無區別。

web與網路遊戲應用在軟體架構上天差地別,網路遊戲尤其是MMORPG是集世界上最尖端的計算機技術之大成為一體!


如果讓我說的話, 遊戲伺服器。主要是能抗DDOS的。 網站伺服器。主要是能抗CC攻擊的。正規的遊戲,一般不會遇到大的攻擊。但是也不得不提前防護好。 私服的話,那攻擊就多了...什麼都有。 我做IDC時間不是很久,但是攻擊的類型不少見...伺服器防護不行,直接就掛了。


遊戲伺服器一方面要求配置比較高,另外就是防禦要好,現在國內可以達到480G單機防禦

線路穩定。


前面分服的遊戲伺服器已經說得非常好了。

具體來說,硬體舉個例子吧:

Tranquility Tech III - EVE Community

這個鏈接描述了EVE伺服器的整體架構和硬體設備。


強交互的遊戲伺服器會產生大量的廣播包,web伺服器不存在這個問題


差別不大,主要還是根據配置和需求來定,因為遊戲伺服器一般來說中低端也能使用,普通伺服器也能是中低端伺服器,可以參考這款


簡單來說,遊戲伺服器就是對抗攻擊、防禦以及穩定性要求更高一些,推薦用真正的高防禦獨立伺服器。


內存什麼得都不一樣啊,而且還得要 高防的伺服器


感謝樓上的牛人們科普


本質上沒有區別,硬要說有無非是遊戲伺服器的配置要求更高


推薦閱讀:

遊戲行業的商業智能是怎樣的?
遊戲公司需要策劃的時候,如果只有新人,如何在新人簡歷中挑選?
如何打動遊戲公司,獲得實習崗位?
你為什麼從多益網路離職?
在中國,都有哪些遊戲公司?為什麼招新人只招沒畢業的,或者應屆生?

TAG:程序員 | 遊戲開發 | 遊戲公司 | 伺服器 | 遊戲伺服器 |