大牛唐健,带你领略游戏服务器与后台架构的奥妙
游戲后臺的架構以及服務器系統是大型游戲開發中一個不可或缺的部分,本期的Live問答欄目中,我們有請到了騰訊互娛服務器專家工程師,騰訊天美工作室技術總監唐健圍繞后臺架構和分布式系統內容與大家展開分享與討論,并回答大家提出的疑問。以下是Live的整理內容。
唐健??騰訊互娛服務器專家工程師,騰訊天美工作室技術總監。擅長分布式系統,海量數據處理和FPS游戲服務器。負責過的項目包括《逆戰》、《CFM》等等。
?
唐健:對于游戲后臺開發,一般玩家在看到一款好玩的游戲的時候往往不會注意到后臺這種東西,更多的會被游戲的畫面和玩法吸引,很多游戲像是單機游戲是沒有后臺的,但是像我們天美的游戲基本都是有后臺的。所以在很多 online的游戲里面,后臺的存在感會比較弱。但是如果想真正做一款能賺錢、完美的游戲,后臺這部分是不可少的。
一般來說,大家所接觸到的后臺可以分為兩個大塊。第一個部分就是支撐系統,比如說帳號、聊天、好友、比賽系統等等,這些其實是位于游戲核心玩法之外的部分,一般我們都把他們稱為支撐系統。
第二個部分就是和游戲核心玩法相關的系統,像是《逆戰》后臺BS系統、《王者榮耀》后臺的邏輯系統,這部分的系統與游戲的核心玩法密切相關。就以我們射擊游戲為例,射擊游戲的邏輯服務器是目前最復雜的集中游戲服務器之一,為什么這么說呢?因為其他的邏輯服務器很少在服務器端跑一個模擬真實的游戲場景,而射擊游戲要在服務器模擬這局比賽所有人的移動、開火、行為動作等等,所以說是目前最復雜的邏輯服務器之一。
還有的就是休閑類游戲,類似《天天酷跑》這種的游戲。他們的游戲邏輯服務器這款就相對比較簡單,因為他們往往只需要做一些后校驗,比如說在一局結束后,在邏輯服務器上做一次校驗就可以了。
像騰訊的一些大型游戲往往要支持成千上萬的人同時在線,所以基本上都是需要上千臺服務器作為一個游戲服務的支撐,當然這幾千臺服務器可能會分布在全國多個地區。我們需要記住的是,服務器不僅僅需要后臺軟件的支持,同時也是需要一個比較完善的支撐平臺。比如說前端網絡的接入、帶寬、內網體系等等。目前來說。一般大型的公司或者云服務基本上具備了底層了平臺的基礎特征,所以我們從一個游戲開發者的角度來說,對于底層我們也不需要考慮過多,因為現在這些底層的網絡技術以及服務器的選用已經比原來簡化了很多。
下面就大家所提出的來問題,進行了以下回答:
1.天美所采用的架構最大支持多少人同時在線不卡?怎么做實時同步?是完全實時同步的嗎?超過這個數值有事如何保證服務器穩定和游戲質量的?
唐健:一般來說服務器的擴展能力還是很強的,當然不是無限擴展。這個跟具體的游戲場景和使用情況有關,像是一局比賽的游戲人數以及場景中所能容納的人數。如果超過了服務器的上限的話,首先我們是考慮從軟件上面來優化,如果實在優化不了話,會考慮平行擴展服務器的方式來解決同時在線問題。
2.服務器分布式調度常用策略都有哪些?適用場景呢?分布式架構下怎么使用緩存來提高游戲服務器的性能?有哪些典型的業務可以通過緩存來提高并發的性能?
唐健:一般而言服務器分布式調度常用策略都采用的比較簡單,采用順序或者加權的方式,一般情況下我們很少能做到那么復雜和精確的調度,平常也不太可能需這些。關于緩存,緩存可以分為幾種級別,比如說random系統,可以把用戶的整個信息放入進去,這樣可以明顯加快整體的進程。當然也可以在接入層做一層比較小的緩存,這樣我們很多時候需要返回信息的話,就不需要網絡請求再做一次了。
3.在多服務程序中,如何保證有關聯的兩條消息依次到達客戶端,使用消息隊列還是有其他方式?
唐健:其實在實際中,我們應該盡力避免這種關聯消失的情況。當然如果實在要有的話,我們可以通過業務端去保證,也就是說我們可以通過一些消息順序號的方式去保證多個消息的關聯性。一般用簡單的方式去保證就足夠了,因為如果我們考慮的太過復雜,可靠性的問題和開發性的問題也得不到保證,有時候我們能通過一些簡單的方式能打到目的就可以了。
4.有沒有適合小型初創團隊的服務器架構推薦,幀同步和狀態同步的開發經驗踩過什么雷?
唐健:建議你們起初還是從一些簡單的邏輯服務器起步,不要涉及太多很復雜的模型,慢慢來。幀同步和狀態同步單一是無法滿足業務的需求的,可能會采用折中的方式,在狀態同步的時候可能會加入一些幀同步,這個要根據需要來決定。
5.灰度上線的功能具體是如何實現的?
唐健:這個問題適用很多的場景,在接入端的時候,QQ號轉讓根據接入到的不同的號碼,騰訊內部這邊接入的QQ號、微信號等來做一個hash,做到某些的hash值的時候,把這部分的流量傳到指定的服務器上去做,按照不同的hash值把不同的用戶引導到不同的服務器上去,這樣就形成了灰度。
對于分區分服來說,灰度測試還是比較好做的,因為可以按需分配功能等。對于全區全服來說,特別是那些復雜業務邏輯的游戲,這個分區分服就很難做了。像是《王者榮耀》是全區全服的,我們給某些人增加了一些英雄,而有的人是沒有的,但是一旦他們同時進行游戲的話會出現各種的問題,所以來說全區全服是比較難做的。
6.天美的服務器端是不是都用C++編寫的? 遇到需要熱更新的情況是怎么處理的?
唐健:天美的服務器大部分都是用C/C++寫的,服務器是沒有熱更新的問題,熱更新是客戶端上的問題。服務器的熱更新要做到讓用戶基本無感知,也不能太過粗暴,沒有任何的提醒與預告。
7.對于在全球部署的分布式服務器(北美、歐洲、亞太等區域),要實現類似全服排行榜功能,排行的數據涉及多個數據表,并且每月為一個賽季,賽季結束排行數據要清零,重新開始新賽季,此種情況下賽季結束時數據庫會有大量數據寫操作,請問此種情景下,數據庫(如mysql)和redis應該采用什么部署策略比較合理?賽季過度期間不想停服應該怎么做?
唐健:這個解決方案有很多種,可以采用緩寫的模式,不用一次把數據寫完,可以定時定量的完成,避免數據的同時大量寫入。
總結
以上是生活随笔為你收集整理的大牛唐健,带你领略游戏服务器与后台架构的奥妙的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《江湖X:汉家江湖》游戏论剑系统技术全解
- 下一篇: 游戏建模、纹理、后期,手把手教你制作《向