久久精品国产亚洲不AV麻豆_久久精品无码一区二区WWW_久久精品亚洲AV熟女_久久久久久精品成人鲁丝电影_久久久噜噜噜久久_久久乐国产精品亚洲综合_久久亚洲欧美国产精品_久青草久青草视频在线观看_麻花豆传媒剧国产免费MV_女邻居丰满的奶水在线观看,欧美日韩在线观看精品一区二区,无码精品人妻一区二区三区中,国产精品亚洲成在人线
藏寶灣
標(biāo)題:
老出BUG怎么辦,?游戲服務(wù)器常見問題的解決方法
[打印本頁]
作者:
閃閃的星仔
時(shí)間:
2020-8-31 14:03
標(biāo)題:
老出BUG怎么辦,?游戲服務(wù)器常見問題的解決方法
在游戲開發(fā)中,我們經(jīng)常會(huì)遇到一些技術(shù)難題,,而其引發(fā)的bug則會(huì)影響整個(gè)游戲的品質(zhì),。女性向手游《食物語》就曾遇到過一些開發(fā)上的難題,騰訊游戲?qū)W院專家團(tuán)Wade,、Zc、Jovi等專家為其提供了指導(dǎo)和幫助,。過載保護(hù),、集群、服務(wù)器通信,、并發(fā)選型等方面的問題,,是中小團(tuán)隊(duì)常常的技術(shù)難題,本文分享了一些專家在坐診過程中提到的游戲服務(wù)器常見問題的解決方法,,希望對(duì)大家有所幫助,。
問題一:玩家登錄時(shí)拉取好友信息,但好友服務(wù)繁忙導(dǎo)致登錄失敗,。
解決方法:
1,、分離關(guān)鍵路徑上非關(guān)鍵調(diào)用,縮短事務(wù)流程,,避免周邊服務(wù)異常阻塞登錄,。
2、服務(wù)熔斷機(jī)制,,超出處理能力快速失敗,,防止雪崩。
3,、按用戶隔離事務(wù),,避兔單個(gè)用戶請(qǐng)求阻塞影響到其他用戶。
問題二:壓測(cè)并發(fā)登錄對(duì)redis產(chǎn)生很大壓力,。
解決方法:redis數(shù)據(jù)表數(shù)量多,,一次事務(wù)會(huì)產(chǎn)生多個(gè) redis請(qǐng)求,小表合并為大表,。
Wade:服務(wù)器進(jìn)程的管理一般比較簡(jiǎn)單,,有很多還是用配置文件靜態(tài)組織的,。同時(shí)往往進(jìn)程間通信的手段比較缺乏,沒有使用消息隊(duì)列中間件,,甚至還有用 Redis 來做通信組件使用的,。為了提高集群管理的自動(dòng)化水平,使用 ZooKeeper 是一個(gè)比較常見的方法,。
Zc:redis一般做為內(nèi)存緩存來使用,不宜將關(guān)鍵數(shù)據(jù)存放在redis中.其數(shù)據(jù)安全性并不如一般的DB,。在使用過程中也需要參考性能基線,控制訪問頻率和流量,。
問題三:外部服務(wù)有延遲,,調(diào)用到的業(yè)務(wù)流程中產(chǎn)生卡頓。
解決方法:業(yè)務(wù)側(cè)增加緩存:同玩好友msdk+最近角色id+角色信息,。
Wade:很多團(tuán)隊(duì)對(duì)于過載保護(hù)不夠重視,,往往只在最外層接入客戶端一側(cè)有最大連接數(shù)或者最大會(huì)話數(shù)的限制。而對(duì)于內(nèi)部的多個(gè)進(jìn)程,,比如訪問數(shù)據(jù)庫的進(jìn)程,,就沒有太多的負(fù)載保護(hù)。由于游戲是帶狀態(tài)的進(jìn)程比較多,,所以負(fù)載均衡往往也做的不多,,基本上是按狀態(tài)所在進(jìn)程去轉(zhuǎn)發(fā)處理請(qǐng)求。
Zc:注意緩存和降級(jí)處理,。外部平臺(tái)數(shù)據(jù),,盡量緩存,提高訪問體驗(yàn),。當(dāng)發(fā)現(xiàn)外部服務(wù)出現(xiàn)故障,,或本身出現(xiàn)負(fù)載風(fēng)險(xiǎn)時(shí),應(yīng)降級(jí)服務(wù),。
Jovi:msdk midas平臺(tái)特權(quán)等api接入工作,,游戲業(yè)務(wù)可以建立一個(gè)隔離層專門處理這塊需求,避兔過分侵入游戲邏輯,,更容易控制,。
問題四:運(yùn)營(yíng)和客服接口修改玩家數(shù)據(jù),會(huì)與正常游戲的數(shù)據(jù)回寫產(chǎn)生競(jìng)爭(zhēng),。
解決方法:使用類似郵件機(jī)制去修改數(shù)據(jù),。
Zc:多線程開發(fā)中,經(jīng)常會(huì)有線程池用盡或線程死鎖導(dǎo)致服務(wù)質(zhì)量下降,。建議將線程池根據(jù)業(yè)務(wù)需求合理分類,,不同業(yè)務(wù)間有合理的負(fù)載配比,不會(huì)相互影響,。非關(guān)鍵流程需要延后或者異步化處理,,避免卡死關(guān)鍵流程,。
同時(shí),合理的線程模型可以有效減少線程間競(jìng)爭(zhēng),。對(duì)確實(shí)需要競(jìng)爭(zhēng)的資源在流程入口處統(tǒng)一有序加鎖,,避免在邏輯過程中,隨意嵌套取鎖競(jìng)爭(zhēng),。并且,,給鎖加個(gè)超時(shí)時(shí)間,避免業(yè)務(wù)中斷,。
Jovi:確保同一時(shí)刻只有單個(gè)數(shù)據(jù)修改點(diǎn),,有助于避免數(shù)據(jù)競(jìng)爭(zhēng)。建議設(shè)計(jì)時(shí)采用CQRS方式,,采用獨(dú)立的數(shù)據(jù)表和服務(wù)記錄事件,,匯總到單一修改服務(wù)上執(zhí)行。
Wade:并發(fā)編程是服務(wù)器端最常見的問題,,一般會(huì)用多線程或者非阻塞兩種方法之一解決,。對(duì)于天然支持多線程的語言,如JAVA,,很多開發(fā)者傾向多線程,好處是代碼編寫起來比較方便,,但是這就要很清醒的對(duì)各種對(duì)象進(jìn)行鎖的操作,,或者熟練使用類似 java.util.concurrent 這種多線程工具庫。而如果使用非阻塞,,好處是不會(huì)有鎖的問題,,但代碼被分割到各個(gè)回調(diào)函數(shù)中,可讀性非常糟糕,,所以有的團(tuán)隊(duì)會(huì)使用“協(xié)程”或者 Promise 之類的工具來緩解這個(gè)問題,,但這也引入了更多的復(fù)雜性。
下面詳細(xì)介紹一下游戲服務(wù)器端架構(gòu)中的調(diào)度架構(gòu),,方便大家理解,。
a) 單進(jìn)程游戲服務(wù)器
最簡(jiǎn)單的游戲服務(wù)器只有一個(gè)進(jìn)程,是一個(gè)單點(diǎn),。這個(gè)進(jìn)程如果退出,,則整個(gè)游戲世界消失。在此進(jìn)程中,,由于需要處理并發(fā)的客戶端的數(shù)據(jù)包,,因此產(chǎn)生了多種選擇方法:
()
上傳
點(diǎn)擊文件名下載附件
同步-動(dòng)態(tài)多線程
每接收一個(gè)用戶會(huì)話,就建立一個(gè)線程,。這個(gè)用戶會(huì)話往往就是由客戶端的TCP連接來代表,,這樣每次從socket中調(diào)用讀取或?qū)懗鰯?shù)據(jù)包的時(shí)候,,都可以使用阻塞模式,編碼直觀而簡(jiǎn)單,。有多少個(gè)游戲客戶端的連接,,就有多少個(gè)線程。但是這個(gè)方案也有很明顯的缺點(diǎn),,就是服務(wù)器容易產(chǎn)生大量的線程,,這對(duì)于內(nèi)存占用不好控制,同時(shí)線程切換也會(huì)造成CPU的性能損失,。更重要的多線程下對(duì)同一塊數(shù)據(jù)的讀寫,,需要處理鎖的問題,這可能讓代碼變的非常復(fù)雜,,造成各種死鎖的BUG,,影響服務(wù)器的穩(wěn)定性。
同步-多線程池
為了節(jié)約線程的建立和釋放,,建立了一個(gè)線程池,。每個(gè)用戶會(huì)話建立的時(shí)候,向線程池申請(qǐng)?zhí)幚砭€程的使用,。在用戶會(huì)話結(jié)束的時(shí)候,,線程不退出,而是向線程池“釋放”對(duì)此線程的使用,。線程池能很好的控制線程數(shù)量,,可以防止用戶暴漲下對(duì)服務(wù)器造成的連接沖擊,形成一種排隊(duì)進(jìn)入的機(jī)制,。但是線程池本身的實(shí)現(xiàn)比較復(fù)雜,,而“申請(qǐng)”、“釋放”線程的調(diào)用規(guī)則需要嚴(yán)格遵守,,否則會(huì)出現(xiàn)線程泄露,,耗盡線程池。
異步-單線程/協(xié)程
在游戲行業(yè)中,,采用Linux的epoll作為網(wǎng)絡(luò)API,,以期得到高性能,是一個(gè)常見的選擇,。游戲服務(wù)器進(jìn)程中最常見的阻塞調(diào)用就是網(wǎng)路IO,,因此在采用epoll之后,整個(gè)服務(wù)器進(jìn)程就可能變得完全沒有阻塞調(diào)用,,這樣只需要一個(gè)線程即可,。這徹底解決了多線程的鎖問題,而且也簡(jiǎn)化了對(duì)于并發(fā)編程的難度。但是,,“所有調(diào)用都不得阻塞”的約束,,并不是那么容易遵守的,比如有些數(shù)據(jù)庫的API就是阻塞的,;另外單進(jìn)程單線程只能使用一個(gè)CPU,,在現(xiàn)在多核多CPU的服務(wù)器情況下,不能充分利用CPU資源,。異步編程由于是基于“回調(diào)”的方式,,會(huì)導(dǎo)致要定義很多回調(diào)函數(shù),并且把一個(gè)流程里面的邏輯,,分別寫在多個(gè)不同的回調(diào)函數(shù)里面,,對(duì)于代碼閱讀非常不利?!槍?duì)這種編碼問題,,協(xié)程(Coroutine)能較好的幫忙,所以現(xiàn)在比較流行使用異步+協(xié)程的組合,。不管怎樣,,異步-單線程模型由于性能好,無需并發(fā)思維,,依然是現(xiàn)在很多團(tuán)隊(duì)的首選,。
異步-固定多線程
這是基于異步-單線程模型進(jìn)化出來的一種模型。這種模型一般有三類線程:主線程,、IO線程,、邏輯線程。這些線程都在內(nèi)部以全異步的方式運(yùn)行,,而他們之間通過無鎖消息隊(duì)列通信。
b) 多進(jìn)程游戲服務(wù)器
多進(jìn)程的游戲服務(wù)器系統(tǒng),,最早起源于對(duì)于性能問題需求,。由于單進(jìn)程架構(gòu)下,總會(huì)存在承載量的極限,,越是復(fù)雜的
游戲制作
其單進(jìn)程承載量就越低,,因此開發(fā)者們一定要突破進(jìn)程的限制,才能支撐更復(fù)雜的游戲,。
一旦走上多進(jìn)程之路,,開發(fā)者們還發(fā)現(xiàn)了多進(jìn)程系統(tǒng)的其他一些好處:能夠利用上多核CPU能力;利用操作系統(tǒng)的工具能更仔細(xì)的監(jiān)控到運(yùn)行狀態(tài),、更容易進(jìn)行容災(zāi)處理,。多進(jìn)程系統(tǒng)比較經(jīng)典的模型是“三層架構(gòu)”:
在多進(jìn)程架構(gòu)下,開發(fā)者一般傾向于把每個(gè)模塊的功能,,都單獨(dú)開發(fā)成一個(gè)進(jìn)程,,然后以使用進(jìn)程間通信來協(xié)調(diào)處理完整的邏輯,。這種思想是典型的“管道與過濾器”架構(gòu)模式思想——把每個(gè)進(jìn)程看成是一個(gè)過濾器,用戶發(fā)來的數(shù)據(jù)包,,流經(jīng)多個(gè)過濾器銜接而成的管道,,最后被完整的處理完。由于使用了多進(jìn)程,,所以首選使用單進(jìn)程單線程來構(gòu)造其中的每個(gè)進(jìn)程,。這樣對(duì)于程序開發(fā)來說,結(jié)構(gòu)清晰簡(jiǎn)單很多,,也能獲得更高的性能,。
()
上傳
點(diǎn)擊文件名下載附件
盡管有很多好處,但是多進(jìn)程系統(tǒng)還有一個(gè)需要特別注意的問題——數(shù)據(jù)存儲(chǔ),。由于要保證數(shù)據(jù)的一致性,,所以存儲(chǔ)進(jìn)程一般都難以切分成多個(gè)進(jìn)程。就算對(duì)關(guān)系型數(shù)據(jù)做分庫分表處理,,也是非常復(fù)雜的,,對(duì)業(yè)務(wù)類型有依賴的。而且如果單個(gè)邏輯處理進(jìn)程承載不了,,由于其內(nèi)存中的數(shù)據(jù)難以分割和同步,,開發(fā)者很難去平行的擴(kuò)展某個(gè)特定業(yè)務(wù)邏輯。他們可能會(huì)選擇把業(yè)務(wù)邏輯進(jìn)程做成無狀態(tài)的,,但是這更加加重了存儲(chǔ)進(jìn)程的性能壓力,,因?yàn)槊看螛I(yè)務(wù)處理都要去存儲(chǔ)進(jìn)程處拉取或?qū)懭霐?shù)據(jù)。
除了數(shù)據(jù)的問題,,多進(jìn)程架構(gòu)也帶來了一系列運(yùn)維和開發(fā)上的問題:首先就是整個(gè)系統(tǒng)的部署更為復(fù)雜了,,因?yàn)樾枰獙?duì)多個(gè)不同類型進(jìn)程進(jìn)行連接配置,造成大量的配置文件需要管理,;其次是由于進(jìn)程間通訊很多,,所以需要定義的協(xié)議也數(shù)量龐大,在單進(jìn)程下一個(gè)函數(shù)調(diào)用解決的問題,,在多進(jìn)程下就要定義一套請(qǐng)求,、應(yīng)答的協(xié)議,這造成整個(gè)源代碼規(guī)模的數(shù)量級(jí)的增大,;最后是整個(gè)系統(tǒng)被肢解為很多個(gè)功能短小的代碼片段,,如果不了解整體結(jié)構(gòu),是很難理解一個(gè)完整的業(yè)務(wù)流程是如何被處理的,,這讓代碼的閱讀和交接成本巨高無比,,特別是在游戲領(lǐng)域,由于業(yè)務(wù)流程變化非常快,,幾經(jīng)修改后的系統(tǒng),,幾乎沒有人能完全掌握其內(nèi)容。
作者:
qwe853824903
時(shí)間:
2020-11-10 20:36
謝謝老板全當(dāng)看看完全不會(huì)
歡迎光臨 藏寶灣 (http://wuyouzp.com/)
Powered by Discuz! X3.5