原因
2020 年 4 月 3 日晚 23 点 50 分,我正在移动端苹果手机上玩跑跑卡丁车,看到在 PC 端挂机的梦幻西游界面提示“系统网络错误”,过了没几秒钟,手机终端也出现类似“系统网络错误”的提示。刷了一下新浪微博,看到各大游戏厂商要在 2020 年 4 月 4 日停服一整天的消息。我从 2020 年 4 月 4 日晚 23 点 50 分开始到 2020 年 4 月 5 日 0 点 30 分简单分析了一下几个 APP 的恢复过程。
过程
案例 1:移动端跑跑卡丁车
2020 年 4 月 5 日 0 点整,在加载动画页面提示“网络异常”。在 0 点 0 分到 0 点 5 分期间,一直都是提示“网络异常”。
在 0 点 5 分到 0 点 10 分期间,加载动画成功,在点击用户授权第三方帐号登录时失败。
在 0 点 10 分时,点击用户授权登录时成功,但是用户授权登录的过程很慢。授权成功后,系统提示”灰度发布,只有部分用户可正常进入,大约在 0 点 20 分时,所有用户皆可正常使用”。
在 0 点 12 分时,可查看到用户信息,好友信息,服务器信息。
在 0 点 15 分时,点击登录按钮,可正常登录和加载其他信息,使用大概正常。
案例 2:移动端梦幻西游藏宝阁
2020 年 4 月 5 日 0 点整,首页查询不出来任何动态数据,只能显示固定标签,首页右侧的标签页:分类、购物车、我的,这三个标签页中同样没有动态数据展示,只能显示固定标签。搜索框搜索不出任何动态数据。无消息推送动态。“我的”中各个角色信息应该是缓存数据,各个角色不能切换;不显示余额;收藏、足迹、订单、还价等模块中同样不展示数据。
在 0 点 5 分到 0 点 10 分期间,首页可查询出动态数据,首页右侧的标签页:分类、购物车有动态数据展示。“我的”中部分模块展示数据。
在 0 点 13 分时,余额显示正常数据,但是下拉时,数据查询特别慢。
在 0 点 15 分时,用户角色可切换,但是切换速度依然很慢。
在 0 点 20 分时,上述各个功能正常,数据加载速度大概恢复未停服之前的能力。
案例 3:移动端网易将军令和梦幻西游 PC 端
2020 年 4 月 5 日 0 点整,首页动态密码正常显示,但是能不能正常使用不清楚。点卡充值没试,应该是能正常充值的。帐号中心整个模块不能正常加载,绑定的所有帐号列表不能刷新,刷新过程中提示“服务器异常”。游戏助手加载失败。
在 0 点 10 分时,登录梦幻西游 PC 端,通过移动端网易将军令扫描二维码登录失败,因为移动端网易将军令依然刷新不出帐号列表,导致这里不能授权登录。需要注意的是,网易账号在其他非游戏页面是可以正常使用的。
在 0 点 15 分时,依然尝试上述步骤,还是不行。此时,手工输入用户名密码,可以登录进去,并且可以选择各个游戏区,选择游戏区后可以手工填写移动端网易将军令上的动态密码,输入完成后可正常登录游戏界面,游戏中的数据为 2020 年 4 月 3 日晚 23 点 50 分之前的数据,期间,比如帮派资金的消耗数据、用户在线天数都是固定的,并没有消耗和增长。
在 0 点 25 分时,移动端网易将军令中的账号列表、游戏助手模块正常使用,也能够授权 PC 端梦幻西游扫描二维码正常登录的功能。
案例分析
概要
在上述相关游戏在 0 点 0 分到 0 点 20 分的恢复过程中,我引发了几个问题的猜测。
1)这些系统都做了哪些操作?
2)这些系统的恢复过程是怎么样的?先后顺序是怎样的?不同模块都是相对独立的?服务开关是怎么做的?
3)资源是怎么加载的?哪些是预加载的?哪些不是?这些资源之间是怎么交互的?
4)整个架构体系中,哪些应用是可以不停机的?这些不停机的应用怎么动态中断用户的操作?不停机的应用怎么“冻结”数据?停机的应用怎么恢复数据?怎么设计数据的开关?在停机的瞬间怎么保证数据的一致性?异常数据的回滚机制是怎样的?
5)灰度发布是怎么做的?比如用户是怎么一批批的授权并让用户登录进来的?怎样做到无感知的?这些根据哪些维度来控制?系统的行为怎样做到可控?用户的行为怎样做到可控?在 0 点时成千上万的用户一直在请求,怎么控制用户的行为?
6)在这种大型应用中,服务器如果是多地域部署的话,怎么控制?哪些因素起了主要的作用?哪些可控?哪些不可控?如果再有国外 APP 的话?这个跟国内的是直接隔离的?
7)以用户的角度来考虑的话,怎样做对用户影响最小?怎么样对用户的友好度最好?重新开服后,补偿机制怎么做?
8)技术细节这里不做讨论。
案例
整个 APP 的服务很多,下面我只能以个人的经验或者说是猜测推出一部分,如有错误的地方,恳请指出,谢谢。
下面的例子中,是先推出恢复逻辑,再推出关闭逻辑。
案例 1:移动端跑跑卡丁车
这里只以用户授权登录来做案例。(图片过小可右键打开图片链接)
1)细心的玩家可以发现如果要进入游戏主页面,必须先重新授权用户,才能登录,上次授权后展示的用户信息和用户上次进入的大区信息已经没有了。
2)提示用户的信息是在授权成功后才提示的,而不是初始化登录页面的时候提示的,这里可以推测一下,在初始化进入登录页面的过程中已经初始化了部分游戏的资源,虽然需要重新授权,但是上次用户的缓存信息只是没有直接使用而已。那么这里可以说授权和登录分别是两道"缓存策略",也可以是"两道开关",相对来说,既不影响用户体验,也能有效处理/降低大批流量的涌入/分流。
3)由于服务过多,每个服务中的数据可以采取一定的缓存策略。
4)服务之间的调用不可避免的会存入队列中,服务之间的调用可采取限流、熔断、降级、版本控制等服务策略。
5)由于这款应用没有开放手工输入用户名密码的形式,所以在控制用户登录进入游戏的开关可以放入授权模块中,当然也可以在授权服务前再放入一层来专门处理开关。
6)还可以发现一个问题,只有授权成功后才会给用户提示游戏的注意事项,刚开始我认为这样是不合理的,但是仔细思考一下,我想到了两点,第一,如果此时,上亿的用户在授权前同时提示游戏注意事项,那么此时服务器的压力是很大的,因为授权成功后的用户是一批批进来的,只需给这部分用户提示即可,因为用户都授权未成功,肯定游戏后台还没初始化完成,未初始化完成提示游戏信息,相对来说,此时是不可必要的。第二,站在使用者的角度来说,这样是否会提前损失一批感兴趣的用户呢?这应该是个比较感性的角度。
7)至于服务停止,我只是在授权服务层设置了一个开关,肯定没有我想象的那么简单,我在“概要”中已经论述了,这里不再展开。
案例 2 和 3:移动端梦幻西游藏宝阁、移动端网易将军令和梦幻西游 PC 端
这里也只以用户授权登录来做案例。(图片过小可右键打开图片链接)
1)先看最左边的藏宝阁,最先响应的模块是所有的商品的列表页,直播列表滞后。
2)登录分为将军令二维码登录和输入账户密码登录(成功后需要手工输入将军令动态密码),此时,手工输入账号密码登录再手工输入将军令动态密码是成功的,但是直接扫描将军令二维码登录是失败的,所以在将军令 APP 的二维码模块和用户授权模块中间我加了块“中间层”的这一个模块。
3)藏宝阁只能一个登录一个游戏账户下的所属角色列表,此时发现,藏宝阁的游戏账户所属角色列表不能显示,将军令的设备账户列表也不能正常显示,说明在二者在账户模块上面是接入的相同模块或者说是有关联的模块,充值模块同理。
4)游戏账户模块恢复完成,余额、提现、订单等模块逐渐恢复。
总结
上述我画了几个案例,简单论述了一下各个模块之间的关系,因为近半年来都在做微服务相关的事情,所以在这方面多说了一下。
关于这次观察,简单概述一下,
1)停服和开服这段时间要尽量的保持用户的“友好”,做好提前告知与补偿机制。
2)停服时间在停服前一日大约提前 10 分钟。
3)开服时间在停服后一日大约十分钟后。
4)停服时利用第三方机制强制用户下线。
5)停服前、停服过程中、开服后要保证数据的一致性。
6)在开服的单位时间内要保证用户的登录顺序问题。
7)要注意各个服务模块的恢复顺序问题。
标题:对2020年4月初各游戏厂商停服一天的多模块服务化的反思
作者:yazong
地址:https://blog.llyweb.com/articles/2020/04/05/1586022469374.html