模拟游戏商城多活架构
一、业务分析
2020 年 11 月公布数据,全年日均活跃 1 亿,注册玩家 6 亿,最高同时在线 100 万。
在此背景下实现王者荣耀商城的异地多活架构。
关于商城做如下分析:
1. 登录用户才能进入商城购买
2. 王者商城经营的是虚拟物品,无需管理库存和物流信息
3. 充值方式:调用微信或 QQ 钱包充值点券,然后用点券购买商城中的物品
4. 同一个用户可以加入不同的区服,俗称“大号”、“小号”,商城购买约束绑定的是“登录 ID+区服 ID”,订单、已购商品信息、优惠券等绑定的也是“登录 ID+区服 ID”
5. 购买约束:同一个登录 ID,在同一个区服,同样的英雄和皮肤只能购买一次;鲜花、改名卡之类的物品可以多次购买
6. 订单 ID 全局唯一,只新建不修改;订单详情绑定订单 ID,只新建不修改
7. 商城商品 ID 全局唯一,商品信息如价格、折扣等可修改
二、 业务分级
商城业务主要包含:登录、商城展示、点券充值、点券管理、商品购买、订单管理、玩家已购商品管理。
异地多活应该保证的业务为:登录、点券管理、玩家已购商品管理。
三、 数据分类
1. 登录
依赖 QQ 和微信授权登录返回的 RoleID,本身无需登录信息,王者荣耀只需记录 RoleID 对应的区服信息,这里的区服数据只会新增不会修改,使用数据库同步即可
2. 点券管理
商品购买订单 ID,全局唯一,只新建不修改,数据库同步即可
3. 玩家已购商品管理
英雄、皮肤:每个区服同一账号只能买一次,只有新增,没有修改
其他道具:可多次购买,数量可修改
四、 数据同步
1. RoleID 和区服对应关系,只会新建不会修改,数据库同步即可
2. 充值订单 ID 和区服对应关系,全局唯一,只会新建不会修改,数据库同步即可
3. 商品购买订单 ID 和区服对应关系,全局唯一,只会新建不会修改,数据库同步即可
4. 点券余额与区服的对应关系,强一致性,数据库同步即可。
5. 区服账号已购商品信息,强一致性,数据库同步即可
五、 多活设计
系统会存在这样的风险点:
本地机房故障时数据未同步,故障恢复前在切换后的机房又产生了充值或购买行为,导致本地机房恢复时数据不一致(点券不一致、商品不一致、英雄或皮肤重复购买等情况),为预防这种情况的产生,可按照下图实施数据同步机制
六、 异常处理
1. 微信和 QQ 怎么办?
商城登录依赖微信、QQ,如果它们有故障,商城端没有处理能力,只能在官网、社区等渠道发公告,说明原因。
2. 充值过程中,本地机房故障导致异常怎么办?
本次充值失败,重新发起充值即可切换到另外的机房正常充值了
3. 充值点券后,本地机房故障,数据未同步导致玩家看到点券数额不对怎么办?
发公告,尽量给一个玩家可接受的理由,并承诺恢复时间,恢复后可以给予一些额外点券作为补偿
4. 购买商品时,本地机房故障导致购买异常怎么办?
重新发起购买即可
5. 购买商品后,本地机房故障,数据未同步,导致玩家看到已购商品未到账怎么办?
和问题 3 一样,发公告,给补偿
6. 本地机房故障时数据未同步,故障恢复前在切换后的机房又产生了充值或购买行为,导致本地机房恢复时数据不一致(点券不一致、商品不一致、英雄或皮肤重复购买等情况),怎么办?
这一点需要在架构设计时就
评论