游戲服務(wù)器框架設(shè)計(jì)
Ø 序言
人們?cè)谡J(rèn)識(shí)事物的時(shí)候,一般都是先從大致的骨架開始,然后再到具體的細(xì)節(jié),金字塔原理中用的比較多的就是自上而下的分析方法,這個(gè)方法放在放之四海而皆準(zhǔn)。那么回到我們游戲服務(wù)器開發(fā)上面,也是如此。那么如何設(shè)計(jì)和選擇服務(wù)器架構(gòu)以及有啥需要注意的呢? 這是本文章要解決的問題。
文章主要目標(biāo)人群是,對(duì)服務(wù)器框架設(shè)計(jì)感興趣,有從事過游戲框架設(shè)計(jì)的同學(xué)。
文章內(nèi)容,介紹五大設(shè)計(jì)原則以及給出兩個(gè)示例,最后做總結(jié)。
Ø 設(shè)計(jì)原則
設(shè)計(jì)原則其實(shí)也是在設(shè)計(jì)時(shí)需要考慮的因素,過度設(shè)計(jì)是加重工作量的元兇,設(shè)計(jì)本質(zhì)就是為了解決問題而存在的,下面列出了5大比較典型的原則。
1. 業(yè)務(wù)邏輯開發(fā)
a) 比如游戲?yàn)榱嗽黾哟鎯?chǔ),你就需要考慮使用內(nèi)存數(shù)據(jù)庫(kù)還是弄個(gè)數(shù)據(jù)庫(kù)網(wǎng)關(guān)服務(wù)器來(lái)處理。
b) 比如游戲?yàn)榱斯芾碛螒蛲婕屹~號(hào),以及支持對(duì)平臺(tái)賬號(hào)的接入,那么就需要賬號(hào)服務(wù)器。
c) 比如游戲?yàn)榱斯芾碛螒蛲婕矣唵魏透櫢顿M(fèi)情況,可能就需要支付服務(wù)器,如果游戲類型是計(jì)時(shí)收費(fèi)的話,那么可能會(huì)需要計(jì)時(shí)服務(wù)器。
2. 運(yùn)營(yíng)維護(hù)
a) 配置
這里牽涉到靜態(tài)配置和動(dòng)態(tài)配置的問題,假設(shè)現(xiàn)在有一臺(tái)網(wǎng)關(guān)服務(wù)器和三臺(tái)游戲邏輯服務(wù)器,靜態(tài)配置的話,就是網(wǎng)關(guān)服務(wù)器這邊寫死只連接這三臺(tái)服務(wù)器,然后讓網(wǎng)關(guān)服務(wù)器主動(dòng)去連接,動(dòng)態(tài)配置的話,就是讓這三臺(tái)服務(wù)器知道這個(gè)網(wǎng)關(guān)服務(wù)器的地址,然后自己在啟動(dòng)的時(shí)候去連接。
b) 開啟或者關(guān)閉順序
這主要是看各個(gè)服務(wù)器上面負(fù)責(zé)什么功能以及服務(wù)器上面的相關(guān)功能,拿游戲登陸服務(wù)器,游戲邏輯服以及數(shù)據(jù)庫(kù)網(wǎng)關(guān)服務(wù)器這三個(gè)服務(wù)器的架構(gòu)來(lái)說,比如開啟的時(shí)候,你盡可能地跟玩家登陸連接的順序相反, 一般都是數(shù)據(jù)庫(kù)網(wǎng)關(guān)服務(wù)器,然后才是游戲邏輯服,最后才是游戲登陸服務(wù)器,其實(shí)就是防止玩家過早地登陸進(jìn)來(lái),卻發(fā)現(xiàn)數(shù)據(jù)還沒有準(zhǔn)備好。
關(guān)閉的順序其實(shí)就是相反的,主要原則就是讓數(shù)據(jù)盡可能地保存好,并且讓玩家不再進(jìn)來(lái)。
c) 動(dòng)態(tài)增刪改
增刪改分為三部分:1)增加一臺(tái)服務(wù)器,2)減少一臺(tái)服務(wù)器,3)修改服務(wù)器信息,比如前面提到的靜態(tài)配置,就是不太方便增加服務(wù)器,要增加一臺(tái)服務(wù)器,需要更新網(wǎng)關(guān)服務(wù)器的配置表,然后讓網(wǎng)關(guān)服務(wù)器重新連接到新的服務(wù)器,而動(dòng)態(tài)配置的話,就非常方便,讓新增的服務(wù)器發(fā)起到網(wǎng)關(guān)服務(wù)器就好了。無(wú)需更改配置。
d) 服務(wù)器管理
服務(wù)器的管理主要在服務(wù)器的在線離線狀態(tài)的管理,中心服務(wù)器(用來(lái)管理其它服務(wù)器)必須實(shí)時(shí)知道所管理服務(wù)器的狀態(tài),比如網(wǎng)關(guān)服務(wù)器必須要實(shí)時(shí)知道游戲邏輯服的狀態(tài),這樣才好更新到登陸服務(wù)器上面,更改服務(wù)器狀態(tài)。基本上在眾多同級(jí)服務(wù)器上面基本上都會(huì)有個(gè)中心服務(wù)器。
3. 性能效率
這需要權(quán)衡利弊和性能優(yōu)劣,比如在ARPG游戲邏輯服務(wù)器里面大量的消耗在AI上面,那么就要考慮給弄個(gè)線程還是進(jìn)程,這同樣適用于聊天功能,有一些聊天功能,或許可以選擇使用UDP來(lái)作為網(wǎng)絡(luò)層通訊方式。是否將功能模塊設(shè)計(jì)成單獨(dú)進(jìn)程,這需要權(quán)衡,雖然可能在運(yùn)營(yíng)中會(huì)部署內(nèi)網(wǎng),相互之間是通過發(fā)消息的,類似于共享內(nèi)存,但是還是會(huì)產(chǎn)生一些消耗的。
4. 負(fù)載均衡
這里包括兩個(gè)部分,硬件負(fù)載均衡,和軟件負(fù)載均衡。硬件負(fù)載均衡主要是指路由器。軟件負(fù)載均衡主要有幾種軟件,nginx/lvs/haproxy/dns, 負(fù)載均衡的策略,可以參考nginx 的負(fù)載均衡,主要有round-robin, least-connected, 以及ip-hash等。
一般來(lái)說,游戲中大都是二級(jí)負(fù)載,首先是在登陸這邊負(fù)載一次,然后再在進(jìn)入游戲邏輯服那邊負(fù)載一次,這樣就夠了。
5. 安全性
這里說下網(wǎng)關(guān)服務(wù)器,其它地方也叫前置服務(wù)器,front-end servers,,這個(gè)有幾個(gè)好處:1)隱藏游戲邏輯服的連接信息. 2) 統(tǒng)籌游戲邏輯服的負(fù)載信息。
Ø 服務(wù)器框架示例
1) 無(wú)中心服務(wù)器架構(gòu)

2) 有中心服務(wù)器架構(gòu)

Ø 結(jié)論
服務(wù)器框架設(shè)計(jì)更像一門藝術(shù),需要在解決問題的同時(shí),又需要注意平衡得失。