每秒百萬次訪問,每天10TB數據,AR遊戲《精靈寶可夢Go》的背後

Esther|編輯 

據Statista統計數據,截止今年1月,風靡全球的LBS AR遊戲《精靈寶可夢Go》僅在iPhone端,日活用戶就有大約82.7萬人。而在一些活動期間,該作的同時在線人數甚至可達數百萬級,自上線以來持續吸引瞭大批忠實玩傢。

與吃雞等MMORPG遊戲不同,《精靈寶可夢Go》不僅需要解決同時多人在線的問題,還需要確保基於線下場景的實時AR內容能在多臺設備上同步。考慮到該作在全球的大規模覆蓋率,大量的LBS AR數據為遊戲背後的技術帶來很大挑戰。那麼,《精靈寶可夢Go》的服務器是如何同時承載數百萬用戶的呢?

據青亭網瞭解,《精靈寶可夢Go》基於谷歌雲服務,因此數據的處理、傳輸、渲染等流程在雲端平臺完成,保證穩定性的同時,也允許LBS AR應用場景足夠靈活。

近期,為瞭瞭解這款遊戲背後的技術,谷歌采訪到Niantic高級工程經理James Prompanya,在采訪中James為我們詳細講述瞭遊戲後臺是如何使用Google Cloud工具來支持大量用戶流量,包括管理和維護大規模用戶端所采用的系統架構,以及其背後發生的故事等等。

Pormpanya表示:在“社區日”和“精靈寶可夢Go Fest 2021”等活動期間,遊戲的流量從40萬人/秒上升至近100萬人/秒。為瞭承載不斷增加的同時在線玩傢,Niantic采用瞭GKE(谷歌容器引擎)、谷歌全球分佈式資料托管服務/資料庫Cloud Spanner等技術,而且在線上獲得瞭谷歌工程師的技術支持。

註:GKE是谷歌旗下的一個Kubernetes管理平臺,主要在谷歌雲平臺上運行。而Kubernetes最初由谷歌工程師開發,後來在2014年開源,它是一種容器編排平臺,用於調度、自動部署、管理和擴展容器化應用。谷歌Spanner是一個分佈式數據庫,專為遊戲狀態儲存而設計,可支撐全球規模的多人遊戲。

谷歌:請介紹一下《精靈寶可夢Go》?

James:這是一款鼓勵玩傢去戶外活動的LBS AR遊戲,與傳統的手遊有很大區別,除瞭在遊戲中互動外,玩傢還可以通過線下的社區活動來社交。在相同的地理位置,多名玩傢可以一起抓同一個寶可夢,體驗共享的AR場景。

Niantic會定期舉辦社區日、GO Fest、限時突襲等活動。通常,活動上線的區域會同時湧入大量玩傢,訪問量從每秒40萬次上升至每秒100萬次。

谷歌:在GO Fest期間,遊戲開發團隊如何擴展後端規模,以處理流量高峰?

James:我們采用多種托管服務來處理增加的計算流量,主要包括GKE和谷歌Cloud Spanner。《精靈寶可夢Go》的前端服務托管在GKE上,GKE基於谷歌雲服務(Google Cloud),管理/擴展節點足夠簡單。

此外,谷歌工程團隊還會在線上為Niantic提供幫助,共同監控和解決《精靈寶可夢Go》在大規模活動期間可能產生的問題。

實際上,在任何時間《精靈寶可夢Go》都有可能湧入大量用戶,甚至需要約5000個Spanner節點來處理。除此之外,我們還采用瞭數千個專門運行《精靈寶可夢Go》的Kubernetes節點。同時,還使用額外的GKE節點來支持遊戲的微服務,提升體驗感。

這些節點同時運行,可支持全球數百萬在線玩傢,讓他們實時共享同樣的LBS AR遊戲內容。

谷歌:《精靈寶可夢Go》從一開始就在使用Spanner服務嗎?還是在廣受用戶歡迎後,才開始在遊戲架構中加入Spanner服務?

James:最初,《精靈寶可夢Go》的數據托管在Google Cloud Datastore(谷歌雲數據倉庫)中,這項雲服務的優勢在於簡單易入門,不需要開發者去管理額外的架構。

隨著玩傢規模逐漸增長,我們希望進一步控制遊戲數據庫的大小和規模,於是便采用谷歌Cloud Spanner服務。同時,我們也很喜歡Spanner提供的連貫索引功能,它讓運行更加復雜的數據庫模式變得足夠方便。

谷歌:加入我是一名遊戲玩傢,正在玩《精靈寶可夢Go》。當我打開該應用,開始捕捉寶可夢,這一過程中背後都發生瞭什麼?

James:當玩傢捕捉到一隻寶可夢,遊戲服務器會通過Cloud Load Balancing(全分佈式負載平衡解決方案,用於避免擁塞、降低延遲、提升安全性、降低成本)收到相關請求。

此外,《精靈寶可夢Go》首次啟動後,儲存在Cloud Storage中的全部靜態媒體都會載入到玩傢手機中。而且,Cloud Load Balancing方案還啟動瞭雲內容分發網絡(CDN),用於緩存和運行遊戲內容。

當玩傢手機的訪問流量到達Global Load Balancer後,系統會向NGINX(高性能HTTP和反向代理web服務器)反向代理發送請求。接著,反向代理將流量發送到遊戲服務器的前端。

Kubernetes還有一個重要部分是空間查詢後端(Spatial Query Backend),這項服務會保存基於共享空間的緩存,並用這些緩存來計算地圖上顯示哪些寶可夢、道館和補給站(PokeStops)、玩傢的時區等任何基於地理位置的內容。

簡單來講,大概是前端負責管理玩傢,以及玩傢和遊戲之間的交互,而空間查詢後端則負責地圖。同時,前端從空間查詢後端獲取信息,並發送給用戶。

谷歌:那在抓寶可夢時又發生瞭什麼?

James:玩傢抓住寶可夢後,系統會通過API從GKE前端向Spanner發送事件。當你更新道館和補給站地圖時,系統請求會發送更新的緩存,並轉發至空間查詢後端。

Spanner中儲存的數據是連貫的,因此在收到緩存更新後,內存中的空間數據也會更新,用於處理之後前端發送的請求。然後,前端再次從空間查詢後端獲取信息,發送回用戶。

谷歌:那麼,如何確保統一地理位置的玩傢,能夠看到相同的寶可夢數據,並保持相對同步呢?尤其是在活動期間。

James:《精靈寶可夢Go》服務器中的一切數據都是確定的,因此,多個客戶端在同一個物理位置可以查看到相同的數據,即使這些玩傢使用不同型號的手機。而在在線人數多的活動期間,遊戲將處理大量緩存和時間同步,所以全部服務器需要同步更新設置變化和事件發生時間,為多名玩傢提供共享AR的體驗。

谷歌:玩傢在玩《精靈寶可夢Go》時,服務器一定產生瞭大量數據,那麼Niantic的數據分析流程是怎樣的,都分析哪些數據?

James:是的,這款遊戲每天可生成5-10TB數據,我們會將這些數據儲存在BigQuery和BigTable中。

團隊中的數據科學團隊會關註遊戲中的事件數據,用於分析玩傢行為,以及驗證寶可夢地圖佈局的效果符合預期,或用於市場報告等等。

除瞭BigQuery外,我們還會使用Dataflow作為數據處理引擎,批量處理儲存在Bigtable中的玩傢日志。

同時,還會處理一些串流數據,包括檢測作弊、尋找和相應不正常玩傢信號。

為瞭獲取全球地理位置和生態信息(用於在地圖上設置補給站和道館),我們從OpenStreetMap、美國地質調查局、Niantic Wayfarer地理數據眾包平臺等數據庫中獲取信息,未來還將構建一個實時動態更新的全球地圖。

谷歌:未來,《精靈寶可夢Go》的活動規模可能會繼續擴大,如果流量高達數百萬用戶/秒,那麼系統服務器將如何擴展?

James:隨著活動規模擴大,系統中數據管道(pub sub、BigQuery Streaming等等)的負載也將增加,我們需要做的就是確保留出預期的配額。

參考:

https://images.weserv.nl/?url=https://cloud.google.com/blog/topics/developers-practitioners/how-pok%25C3%25A9mon-go-scales-millions-requests

( END)

    推薦閱讀    

 每天五分鐘,輕松瞭解前沿科技。             —— 青亭網