如今,网络游戏采用免费游玩(Free to Play)加内购的比例要远大于买断制,这是因为前者能带来更低的用户门槛。甚至有游戏为了获取更多的用户,选择把原来的买断制改为免费游玩,一个典型的例子就是最近的网易的永劫无间改免费。不过修改付费模式后,可能带来用户量的大幅增长,这就对原来的服务端架构有了更高的要求。
在GDC 2021上,来自《火箭联盟》项目的工程师就为我们分享了类似的经验——《《火箭联盟》:为免费游玩而进行的扩展》(Rocket League: Scaling for Free to Play)。他讲述了如何优化架构,以支撑改版后用户量多达5倍的增长。
《火箭联盟》是一款由美国独立游戏工作室Psyonix开发的赛车竞速游戏,获得过TGA年度最佳体育游戏大奖,在国内也有腾讯代理。为了拓展更多的用户,它在2020年夏天转为免费游戏。
分享主要包括几方面:一是为改版做的准备和压力测试,二是对架构的扩展和改进,三是从改版中获得的经验。
改版准备
项目组估计,改版后新玩家数量是改版前常规release发布时的3-5倍。因此压力测试以5倍上限作为目标。
同时项目组向Google和Redis Labs需求技术支持,花费在这上面的代价肯定小于机器宕机的代价。
压力测试选用的框架是Locust。这是一个用Python写的开源压力测试工具,它是分布式和可伸缩的,可以支持成千上万用户,而且提供基于Web的UI查看测试结果。
测试结果的评估包括几个方面:HTTP返回码、服务日志及资源利用率。根据测试结果,对代码做了相应的调整和改进。
架构扩展
首先是核心服务迁移到Kubernetes。从原来的Google App Engine(GAE)迁移到Google Kubernetes Engine(GKE)。前者只有容器功能,而后者提供了完整的服务编排和集群功能。
其次是匹配服务的改造。原有的匹配服务是一个单线程的.NET应用,性能较差。新版匹配服务改用了性能更好的OpenMatch。OpenMatch是一个谷歌发布的开源游戏匹配框架,依托于容器和Kubernetes来运行;它的匹配算法基于MapReduce,可扩展性强。
再次是Redis企业版移植。Redis企业版的全自动重分片(Re-sharding)功能是他们特别需要的特性,尽管它会带来一些性能开销。另外,Redis企业版提供了更好的命令可视化,以及完善的监视图表。
然后是MySQL改进。原来的架构只支持MySQL垂直扩展,面对改版后更高的并发压力,单机承载面临瓶颈,又没有时间迁移到水平扩展的架构,因此选择使用ProxySQL。ProxySQL是一种MySQL代理中间件,选择它主要是看中了动态查询路由、故障切换等功能以及扩展能力强的特点,尽管使用它会带来一定的学习曲线。
最后是流量限制(Rate Limit)。使用了登录队列来控制流量,这也是许多游戏的通常做法。后续还进一步对除了登录外的其他服务进行流量控制。
经验总结
上线之后的巅峰在线人数多于改版前的5倍,但是少于压力测试的最高值,因此还在允许的承载范围内,原先的5倍预估还算比较准确。在线人数稳定后也仍然维持在3倍的高位,更多的在线对服务器带来了更大的承载压力,因此后续版本迭代也在进行持续的压力测试。
经过这次改版,收获了以下经验:
- 早早开始规划。不要羞于寻求外界帮助,但也不要过度规划。
- 要做好压力测试很难,但是非常重要。
- 有序安排好重要的特性开发,依据中间的时间节点按时完成。
- 像流量限制一样实现多种功能的控制。