據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等等)的負載也將增加,我們需要做的就是確保留出預期的配額。參考:Google