為了編寫基于cellnet的新一代游戲服務(wù)器框架,最近深入研究微服務(wù),ServiceMesh等概念。研究過程中對(duì)Web和游戲兩種服務(wù)器架構(gòu)設(shè)計(jì)有一些心得,編寫并記錄下來。(下文中,Game表示游戲服務(wù)器,Web表示W(wǎng)eb服務(wù)器) ``
狀態(tài)緩存
所謂狀態(tài)緩存,就是在內(nèi)存而非專業(yè)數(shù)據(jù)緩存服務(wù)器(如redis)中保存和處理邏輯數(shù)據(jù),手動(dòng)編寫此過程較為繁瑣但是效率較高,但隨著狀態(tài)邏輯復(fù)雜性和并發(fā)、擴(kuò)容問題提出,狀態(tài)同步會(huì)變得越來越復(fù)雜。
Game:
強(qiáng)交互性的服務(wù)器類型需要在服務(wù)器做緩存,邏輯編寫也較為容易,無需處理事務(wù)并發(fā)問題。例如:組隊(duì),匹配,戰(zhàn)斗邏輯。服務(wù)器不能隨意重啟。
弱交互性的服務(wù)器類型可配合redis做成無狀態(tài)服務(wù)器,例如:養(yǎng)成,技能升級(jí),領(lǐng)取物品等。服務(wù)器隨時(shí)支持重啟。
游戲服務(wù)器為了提高性能,早期所有服務(wù)器都是使用狀態(tài)緩存寫法編寫,特別是MMORPG這類強(qiáng)交互的游戲服務(wù)器尤為嚴(yán)重。
Web:
均為無狀態(tài)服務(wù)器,弱交互。使用事務(wù)方式處理并發(fā)邏輯,例如:交易,下單等。
推送,單獨(dú)發(fā)送
這里提到的所謂推送,單獨(dú)發(fā)送是與RPC區(qū)別的通訊方法。RPC要求請(qǐng)求必須有回應(yīng)。而推送單獨(dú)發(fā)送則更像是通知和廣播,無需目的方返回任何消息。
Game:
找到服務(wù)器的Session,直接Send
通過中轉(zhuǎn)服務(wù)器,或稱為中心服務(wù)器進(jìn)行注冊(cè)/廣播
客戶端的model數(shù)據(jù)需要更新時(shí),服務(wù)器會(huì)主動(dòng)推送消息。
游戲服務(wù)器沒有嚴(yán)格的RPC設(shè)計(jì)需求,推送和單獨(dú)發(fā)送較Web服務(wù)器更多。而且游戲服務(wù)器多使用長連接,所以主動(dòng)推送也比Web服務(wù)器來的方便一些。
Web:
將推送做成專有的服務(wù),并做排隊(duì)和并發(fā)處理。
可用性
聽說過游戲停服更新,支付寶服務(wù)器在刷二維碼時(shí)停服了可一定被罵慘吧。Web對(duì)服務(wù)器高可用性要求很高,游戲雖然也注重服務(wù)器穩(wěn)定性和可用性,但是由于版本迭代更新頻繁,停服更新反而能獲得玩家接受。
Game:
游戲?qū)捎眯砸蟛桓摺?/span>
游戲大版本更新時(shí)需要停服更新。支持熱更新技術(shù)的服務(wù)器(例如Erlang,Skynet)僅使用熱更新修復(fù)bug,很少直接更新新版本。
不是所有的游戲服務(wù)器支持動(dòng)態(tài)添加服務(wù)器。
Web:
極高的可用性,服務(wù)不允許停服更新,使用藍(lán)綠及灰度方式更新服務(wù)器。
隨時(shí)可以橫向擴(kuò)展服務(wù)器,提高服務(wù)器容量和承載。
連接及傳輸
均使用TCP傳輸協(xié)議,游戲服務(wù)器注重性能,自有協(xié)議及二進(jìn)制協(xié)議使用較多。
Web注重兼容和接口友好,使用JSON格式較多。
Game:
使用長連接,需要從邏輯層維護(hù)連接狀態(tài)及處理服務(wù)器不在線情況
使用自有封包格式,大部分使用protobuf或二進(jìn)制流格式。
Web:
微服務(wù)大部分使用短連接,grpc支持http2長連接
使用json編碼方便調(diào)試和版本兼容。
流量限制
人數(shù)多了,任何服務(wù)器都扛不住,流量限制和登入限制能有效保護(hù)服務(wù)器穩(wěn)定。
Game:
單服有人數(shù)限制,可以通過GM后臺(tái)設(shè)置擋墻,超過無法進(jìn)入
Web:
限流器中間件,可以精確到服務(wù)控制流量
斷流,防止雪崩
Game:
游戲沒有,也不需要這種概念,游戲請(qǐng)求不會(huì)突然升高,即便有,也通過GM后臺(tái)人為控制
Web:
斷流器中間件
服務(wù)發(fā)現(xiàn)
如何找到服務(wù)器地址。
服務(wù)有變化時(shí),通過Watch系統(tǒng)通知訂閱者更新本地緩存
服務(wù)器沒有變化時(shí),使用本地緩存找到服務(wù)地址
Game:
游戲服務(wù)器互相依賴復(fù)用只在很小的范圍內(nèi),因此無需在不同語言不同進(jìn)程服務(wù)間獲得地址,大部分在配置文件中填寫各服務(wù)的IP及地址即可互相訪問。
早期游戲自己編寫服務(wù)器狀態(tài)及地址發(fā)現(xiàn)服務(wù)。
有用redis做服務(wù)發(fā)現(xiàn)
Web:
使用服務(wù)發(fā)現(xiàn)系統(tǒng),分布式部署。無需依賴配置文件
網(wǎng)關(guān)需求
Game:
網(wǎng)關(guān)處理客戶端上下線通知,心跳,維持連接,轉(zhuǎn)發(fā),廣播上下行封包
Web:
根據(jù)請(qǐng)求地址路由,無上下線概念,無心跳。廣播通過消息推送系統(tǒng)完成
由于筆者從事游戲行業(yè),對(duì)Web服務(wù)器概念在逐漸熟悉中,若有錯(cuò)誤和不足請(qǐng)各位大佬指出。
posted on 2018-08-29 11:16 戰(zhàn)魂小筑 閱讀(2704) 評(píng)論(0) 編輯 收藏 引用 所屬分類: 游戲開發(fā)技術(shù) 、網(wǎng)絡(luò) 服務(wù)器技術(shù) 、Golang