每秒百万次访问,每天10TB数据,AR游戏《精灵宝可梦Go》的背后

无极三( ID:qingtinwang )--链接科技前沿,服务商业创新

据Statista统计数据,截止今年1月,风靡全球的LBS AR游戏《精灵宝可梦Go》仅在iPhone端,日活用户就有大约82.7万人。而在一些活动期间,该作的同时在线人数甚至可达数百万级,自上线以来持续吸引了大批忠实玩家。

精灵宝可梦Go

与吃鸡等MMORPG游戏不同,《精灵宝可梦Go》不仅需要解决同时多人在线的问题,还需要确保基于线下场景的实时AR内容能在多台设备上同步。考虑到该作在全球的大规模覆盖率,大量的LBS AR数据为游戏背后的技术带来很大挑战。那么,《精灵宝可梦Go》的服务器是如何同时承载数百万用户的呢?

据无极三了解,《精灵宝可梦Go》基于谷歌云服务,因此数据的处理、传输、渲染等流程在云端平台完成,保证稳定性的同时,也允许LBS AR应用场景足够灵活。

近期,为了了解这款游戏背后的技术,谷歌采访到Niantic高级工程经理James Prompanya,在采访中James为我们详细讲述了游戏后台是如何使用Google Cloud工具来支持大量用户流量,包括管理和维护大规模用户端所采用的系统架构,以及其背后发生的故事等等。

Niantic

Pormpanya表示:在“社区日”和“精灵宝可梦Go Fest 2021”等活动期间,游戏的流量从40万人/秒上升至近100万人/秒。为了承载不断增加的同时在线玩家,Niantic采用了GKE(谷歌容器引擎)、谷歌全球分布式资料托管服务/资料库Cloud Spanner等技术,而且在线上获得了谷歌工程师的技术支持。

注:GKE是谷歌旗下的一个Kubernetes管理平台,主要在谷歌云平台上运行。而Kubernetes最初由谷歌工程师开发,后来在2014年开源,它是一种容器编排平台,用于调度、自动部署、管理和扩展容器化应用。谷歌Spanner是一个分布式数据库,专为游戏状态储存而设计,可支撑全球规模的多人游戏。

谷歌:请介绍一下《精灵宝可梦Go》?

James:这是一款鼓励玩家去户外活动的LBS AR游戏,与传统的手游有很大区别,除了在游戏中互动外,玩家还可以通过线下的社区活动来社交。在相同的地理位置,多名玩家可以一起抓同一个宝可梦,体验共享的AR场景。

精灵宝可梦4

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游戏内容。

精灵宝可梦3

谷歌:《精灵宝可梦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发送事件。当你更新道馆和补给站地图时,系统请求会发送更新的缓存,并转发至空间查询后端。

精灵宝可梦Go

Spanner中储存的数据是连贯的,因此在收到缓存更新后,内存中的空间数据也会更新,用于处理之后前端发送的请求。然后,前端再次从空间查询后端获取信息,发送回用户。

谷歌:那么,如何确保统一地理位置的玩家,能够看到相同的宝可梦数据,并保持相对同步呢?尤其是在活动期间。

James:《精灵宝可梦Go》服务器中的一切数据都是确定的,因此,多个客户端在同一个物理位置可以查看到相同的数据,即使这些玩家使用不同型号的手机。而在在线人数多的活动期间,游戏将处理大量缓存和时间同步,所以全部服务器需要同步更新设置变化和事件发生时间,为多名玩家提供共享AR的体验。

谷歌:玩家在玩《精灵宝可梦Go》时,服务器一定产生了大量数据,那么Niantic的数据分析流程是怎样的,都分析哪些数据?

James:是的,这款游戏每天可生成5-10TB数据,我们会将这些数据储存在BigQuery和BigTable中。

团队中的数据科学团队会关注游戏中的事件数据,用于分析玩家行为,以及验证宝可梦地图布局的效果符合预期,或用于市场报告等等。

除了BigQuery外,我们还会使用Dataflow作为数据处理引擎,批量处理储存在Bigtable中的玩家日志。

同时,还会处理一些串流数据,包括检测作弊、寻找和相应不正常玩家信号。

为了获取全球地理位置和生态信息(用于在地图上设置补给站和道馆),我们从OpenStreetMap、美国地质调查局、Niantic Wayfarer地理数据众包平台等数据库中获取信息,未来还将构建一个实时动态更新的全球地图。

谷歌:未来,《精灵宝可梦Go》的活动规模可能会继续扩大,如果流量高达数百万用户/秒,那么系统服务器将如何扩展?

James:随着活动规模扩大,系统中数据管道(pub sub、BigQuery Streaming等等)的负载也将增加,我们需要做的就是确保留出预期的配额。参考:

更多精彩内容,关注无极三微信号(ID:qingtinwang),或者来微博@无极三与我们互动!转载请注明版权和原文链接!
无极三

微信扫码关注无极三

无极三

青亭 | 前沿科技交流群01

责任编辑:hi188
分享到QQ 分享到微信

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录
切换登录

注册