Pokémon GO 也就是《精靈寶可夢》,任天堂和谷歌 Niantic Labs 合作開發的現實增強(AR)游戲,也是谷歌云罕見的支持的大型的游戲,就目前來看,Pokémon GO目前在線用戶可以達到數百萬人次,谷歌云平臺是如何支持 Pokémon GO 容納如此多的用戶的呢?
Pokémon GO 的擴展性主要是基于 Google Kubernetes Engine(谷歌云上的kubernetes的全面托管工具) 和 Cloud Spanner(全球分布式企業級數據庫),前端服務托管在 GKE上,可以通過 GKE 這個托管平臺輕松擴展結點,直接使用谷歌云平臺上的管理k8s集群所需的工具。目前在流量龐大的時間點,會有數千個專門為 Pokémon GO 運行的 kubernetes 節點,以及運行有助于增強游戲體驗的各種微服務的 GKE 節點,在特定時間支撐世界各地的數百萬玩家,與其他大型多人在線游戲不同的是, Pokémon GO 上的游戲玩家共享一個“realm”,玩家可以相互交互并共享相同的游戲狀態。
除了GKE外,谷歌云平臺提供 Goggle Cloud Monitoring來搜索日志、構建儀表板,并在出現緊急情況時發出警報。同時還有大型用戶數據庫,在 Pokémon GO 剛發行的時候,使用的數據庫為 Google Datastore,這是個簡單的入門數據庫,管理簡單。隨著游戲的成熟,團隊開始使用 Cloud Spanner,方便擴展,且可以提供一致索引,允許團隊使用帶有主鍵和輔助鍵的更復雜的數據庫架構,且 Cloud Spanner 是具有完全一致性的關系型數據庫。
當一名用戶打開 Pokémon GO 的時候,會通過 Cloud Load Balancing 收到用戶請求,收到后存儲在 Cloud Storage 中的所有靜態媒體都會在應用程序第一次啟動時下載到手機。同時 Cloud Load Balancing 會啟用 Cloud CDN緩存和提供內容。當來自用戶手機的流量到達 Global Load Balancer 后,將請求發送到 NGINX 反向代理,然后反向代理將流量發送到前端游戲服務。
集群中的第三個 pod 是空間查詢后端。此服務保留按位置分片的緩存。然后,此緩存和服務決定地圖上顯示哪些 Pokémon、用戶周圍有哪些體育館和 PokéStops、用戶所在的時區,以及基本上任何其他基于位置的功能。前端管理玩家及其與游戲的交互,而空間查詢后端處理地圖。前端從空間查詢后端作業中檢索信息以發送回用戶。
當用戶捕捉到 Pokémon 的時候,會通過 API 從 GKE 前端向 Spanner 發送一個事件,從前端到 Spanner 的寫入請求完成時,比如執行更新地圖操作時,該請求會發送緩存更新并轉發到空間查詢后端。
Spanner最終是一致的:一旦接收到更新,空間數據就會在內存中更新,然后用于服務來自前端的請求,然后前端從空間查詢后端檢索信息并將其發送回用戶。團隊還將每個用戶操作的 protobuf 表示寫入Bigtable,以使用嚴格的保留策略記錄和跟蹤數據。我們還將消息從前端發布到用于分析管道的Pub/Sub主題。
通過前后端的輸入和輸出,實現了游戲在不同用戶上的同步。
游戲用戶每天生成 5-10TB 的數據,團隊會將所有數據存儲在 BigQuery 和 BigTable 中。數據科學團隊會對這些游戲事件感興趣,以分析玩家行為、驗證諸如確??诖值姆植挤蠄F隊對給定事件的預期、營銷報告等功能。
團隊還使用 BigQuery - 它可擴展且完全托管,可以專注于分析和構建復雜的查詢,而無需過多擔心數據的結構或表的架構。用戶想要查詢的任何字段都以一種允許用戶構建自己在整個團隊中共享的各種儀表板、報告和圖表的方式進行索引。
游戲團隊使用 Dataflow 作為數據處理引擎,因此運行 Dataflow 批處理作業來處理存儲在 Bigtable 中的玩家日志。 還有一些流媒體作業,用于檢測作弊、尋找和響應不正確的玩家信號。
隨著事務的增加,整個系統的負載也會增加,比如數據管道(pub sub、BigQuery Streaming 等)。Niantic SRE 團隊唯一需要確保的是他們對這些事件有正確的配額,而且由于這些是托管服務,Niantic 團隊的運營開銷要少得多。
文章參考:Google Cloud Blog
?
11月4日Cloud Ace工程師將分享關于谷歌推出的Cloud Spanner——全球分布且強一致性的企業級數據庫服務,歡迎各位報名參加。
|