據(jù)Statista統(tǒng)計(jì)數(shù)據(jù),截止今年1月,風(fēng)靡全球的LBS AR游戲《精靈寶可夢Go》僅在iPhone端,日活用戶就有大約82.7萬人。而在一些活動(dòng)期間,該作的同時(shí)在線人數(shù)甚至可達(dá)數(shù)百萬級(jí),自上線以來持續(xù)吸引了大批忠實(shí)玩家。
與吃雞等MMORPG游戲不同,《精靈寶可夢Go》不僅需要解決同時(shí)多人在線的問題,還需要確?;诰€下場景的實(shí)時(shí)AR內(nèi)容能在多臺(tái)設(shè)備上同步??紤]到該作在全球的大規(guī)模覆蓋率,大量的LBS AR數(shù)據(jù)為游戲背后的技術(shù)帶來很大挑戰(zhàn)。那么,《精靈寶可夢Go》的服務(wù)器是如何同時(shí)承載數(shù)百萬用戶的呢?
據(jù)青亭網(wǎng)了解,《精靈寶可夢Go》基于谷歌云服務(wù),因此數(shù)據(jù)的處理、傳輸、渲染等流程在云端平臺(tái)完成,保證穩(wěn)定性的同時(shí),也允許LBS AR應(yīng)用場景足夠靈活。
近期,為了了解這款游戲背后的技術(shù),谷歌采訪到Niantic高級(jí)工程經(jīng)理James Prompanya,在采訪中James為我們?cè)敿?xì)講述了游戲后臺(tái)是如何使用Google Cloud工具來支持大量用戶流量,包括管理和維護(hù)大規(guī)模用戶端所采用的系統(tǒng)架構(gòu),以及其背后發(fā)生的故事等等。
Pormpanya表示:在“社區(qū)日”和“精靈寶可夢Go Fest 2021”等活動(dòng)期間,游戲的流量從40萬人/秒上升至近100萬人/秒。為了承載不斷增加的同時(shí)在線玩家,Niantic采用了GKE(谷歌容器引擎)、谷歌全球分布式資料托管服務(wù)/資料庫Cloud Spanner等技術(shù),而且在線上獲得了谷歌工程師的技術(shù)支持。
注:GKE是谷歌旗下的一個(gè)Kubernetes管理平臺(tái),主要在谷歌云平臺(tái)上運(yùn)行。而Kubernetes最初由谷歌工程師開發(fā),后來在2014年開源,它是一種容器編排平臺(tái),用于調(diào)度、自動(dòng)部署、管理和擴(kuò)展容器化應(yīng)用。谷歌Spanner是一個(gè)分布式數(shù)據(jù)庫,專為游戲狀態(tài)儲(chǔ)存而設(shè)計(jì),可支撐全球規(guī)模的多人游戲。
谷歌:請(qǐng)介紹一下《精靈寶可夢Go》?
James:這是一款鼓勵(lì)玩家去戶外活動(dòng)的LBS AR游戲,與傳統(tǒng)的手游有很大區(qū)別,除了在游戲中互動(dòng)外,玩家還可以通過線下的社區(qū)活動(dòng)來社交。在相同的地理位置,多名玩家可以一起抓同一個(gè)寶可夢,體驗(yàn)共享的AR場景。
Niantic會(huì)定期舉辦社區(qū)日、GO Fest、限時(shí)突襲等活動(dòng)。通常,活動(dòng)上線的區(qū)域會(huì)同時(shí)涌入大量玩家,訪問量從每秒40萬次上升至每秒100萬次。
谷歌:在GO Fest期間,游戲開發(fā)團(tuán)隊(duì)如何擴(kuò)展后端規(guī)模,以處理流量高峰?
James:我們采用多種托管服務(wù)來處理增加的計(jì)算流量,主要包括GKE和谷歌Cloud Spanner?!毒`寶可夢Go》的前端服務(wù)托管在GKE上,GKE基于谷歌云服務(wù)(Google Cloud),管理/擴(kuò)展節(jié)點(diǎn)足夠簡單。
此外,谷歌工程團(tuán)隊(duì)還會(huì)在線上為Niantic提供幫助,共同監(jiān)控和解決《精靈寶可夢Go》在大規(guī)?;顒?dòng)期間可能產(chǎn)生的問題。
實(shí)際上,在任何時(shí)間《精靈寶可夢Go》都有可能涌入大量用戶,甚至需要約5000個(gè)Spanner節(jié)點(diǎn)來處理。除此之外,我們還采用了數(shù)千個(gè)專門運(yùn)行《精靈寶可夢Go》的Kubernetes節(jié)點(diǎn)。同時(shí),還使用額外的GKE節(jié)點(diǎn)來支持游戲的微服務(wù),提升體驗(yàn)感。
這些節(jié)點(diǎn)同時(shí)運(yùn)行,可支持全球數(shù)百萬在線玩家,讓他們實(shí)時(shí)共享同樣的LBS AR游戲內(nèi)容。
谷歌:《精靈寶可夢Go》從一開始就在使用Spanner服務(wù)嗎?還是在廣受用戶歡迎后,才開始在游戲架構(gòu)中加入Spanner服務(wù)?
James:最初,《精靈寶可夢Go》的數(shù)據(jù)托管在Google Cloud Datastore(谷歌云數(shù)據(jù)倉庫)中,這項(xiàng)云服務(wù)的優(yōu)勢在于簡單易入門,不需要開發(fā)者去管理額外的架構(gòu)。
隨著玩家規(guī)模逐漸增長,我們希望進(jìn)一步控制游戲數(shù)據(jù)庫的大小和規(guī)模,于是便采用谷歌Cloud Spanner服務(wù)。同時(shí),我們也很喜歡Spanner提供的連貫索引功能,它讓運(yùn)行更加復(fù)雜的數(shù)據(jù)庫模式變得足夠方便。
谷歌:加入我是一名游戲玩家,正在玩《精靈寶可夢Go》。當(dāng)我打開該應(yīng)用,開始捕捉寶可夢,這一過程中背后都發(fā)生了什么?
James:當(dāng)玩家捕捉到一只寶可夢,游戲服務(wù)器會(huì)通過Cloud Load Balancing(全分布式負(fù)載平衡解決方案,用于避免擁塞、降低延遲、提升安全性、降低成本)收到相關(guān)請(qǐng)求。
此外,《精靈寶可夢Go》首次啟動(dòng)后,儲(chǔ)存在Cloud Storage中的全部靜態(tài)媒體都會(huì)載入到玩家手機(jī)中。而且,Cloud Load Balancing方案還啟動(dòng)了云內(nèi)容分發(fā)網(wǎng)絡(luò)(CDN),用于緩存和運(yùn)行游戲內(nèi)容。
當(dāng)玩家手機(jī)的訪問流量到達(dá)Global Load Balancer后,系統(tǒng)會(huì)向NGINX(高性能HTTP和反向代理web服務(wù)器)反向代理發(fā)送請(qǐng)求。接著,反向代理將流量發(fā)送到游戲服務(wù)器的前端。
Kubernetes還有一個(gè)重要部分是空間查詢后端(Spatial Query Backend),這項(xiàng)服務(wù)會(huì)保存基于共享空間的緩存,并用這些緩存來計(jì)算地圖上顯示哪些寶可夢、道館和補(bǔ)給站(PokeStops)、玩家的時(shí)區(qū)等任何基于地理位置的內(nèi)容。
簡單來講,大概是前端負(fù)責(zé)管理玩家,以及玩家和游戲之間的交互,而空間查詢后端則負(fù)責(zé)地圖。同時(shí),前端從空間查詢后端獲取信息,并發(fā)送給用戶。
谷歌:那在抓寶可夢時(shí)又發(fā)生了什么?
James:玩家抓住寶可夢后,系統(tǒng)會(huì)通過API從GKE前端向Spanner發(fā)送事件。當(dāng)你更新道館和補(bǔ)給站地圖時(shí),系統(tǒng)請(qǐng)求會(huì)發(fā)送更新的緩存,并轉(zhuǎn)發(fā)至空間查詢后端。
Spanner中儲(chǔ)存的數(shù)據(jù)是連貫的,因此在收到緩存更新后,內(nèi)存中的空間數(shù)據(jù)也會(huì)更新,用于處理之后前端發(fā)送的請(qǐng)求。然后,前端再次從空間查詢后端獲取信息,發(fā)送回用戶。
谷歌:那么,如何確保統(tǒng)一地理位置的玩家,能夠看到相同的寶可夢數(shù)據(jù),并保持相對(duì)同步呢?尤其是在活動(dòng)期間。
James:《精靈寶可夢Go》服務(wù)器中的一切數(shù)據(jù)都是確定的,因此,多個(gè)客戶端在同一個(gè)物理位置可以查看到相同的數(shù)據(jù),即使這些玩家使用不同型號(hào)的手機(jī)。而在在線人數(shù)多的活動(dòng)期間,游戲?qū)⑻幚泶罅烤彺婧蜁r(shí)間同步,所以全部服務(wù)器需要同步更新設(shè)置變化和事件發(fā)生時(shí)間,為多名玩家提供共享AR的體驗(yàn)。
谷歌:玩家在玩《精靈寶可夢Go》時(shí),服務(wù)器一定產(chǎn)生了大量數(shù)據(jù),那么Niantic的數(shù)據(jù)分析流程是怎樣的,都分析哪些數(shù)據(jù)?
James:是的,這款游戲每天可生成5-10TB數(shù)據(jù),我們會(huì)將這些數(shù)據(jù)儲(chǔ)存在BigQuery和BigTable中。
團(tuán)隊(duì)中的數(shù)據(jù)科學(xué)團(tuán)隊(duì)會(huì)關(guān)注游戲中的事件數(shù)據(jù),用于分析玩家行為,以及驗(yàn)證寶可夢地圖布局的效果符合預(yù)期,或用于市場報(bào)告等等。
除了BigQuery外,我們還會(huì)使用Dataflow作為數(shù)據(jù)處理引擎,批量處理儲(chǔ)存在Bigtable中的玩家日志。
同時(shí),還會(huì)處理一些串流數(shù)據(jù),包括檢測作弊、尋找和相應(yīng)不正常玩家信號(hào)。
為了獲取全球地理位置和生態(tài)信息(用于在地圖上設(shè)置補(bǔ)給站和道館),我們從OpenStreetMap、美國地質(zhì)調(diào)查局、Niantic Wayfarer地理數(shù)據(jù)眾包平臺(tái)等數(shù)據(jù)庫中獲取信息,未來還將構(gòu)建一個(gè)實(shí)時(shí)動(dòng)態(tài)更新的全球地圖。
谷歌:未來,《精靈寶可夢Go》的活動(dòng)規(guī)模可能會(huì)繼續(xù)擴(kuò)大,如果流量高達(dá)數(shù)百萬用戶/秒,那么系統(tǒng)服務(wù)器將如何擴(kuò)展?
James:隨著活動(dòng)規(guī)模擴(kuò)大,系統(tǒng)中數(shù)據(jù)管道(pub sub、BigQuery Streaming等等)的負(fù)載也將增加,我們需要做的就是確保留出預(yù)期的配額。參考:Google