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