王者荣耀商城异地多活架构设计
【背景】
假设现在决定要实现王者荣耀里面的商城的异地多活架构,请你分析设计一下。
【作业要求】
1. 分析王者荣耀商城的业务特点,设计其异地多活架构;
2. 按照模块 7 第 5 课的方法来设计异地多活架构。
【提示】
1. 王者荣耀的商城是虚拟物品商城,和淘宝这种实物电商有两个很大的区别,注意识别出来;
2. 用户要先调用微信钱包或者 QQ 钱包充值点券,然后在商城里面用点券支付;
3. 用户买英雄和皮肤的时候同样的英雄和皮肤只能买 1 个,不能重复购买;
4. 用户买鲜花、改名卡之类的道具可以买多个;
5. 分析步骤参考模块 7 第 6 课的案例。
业务分析
业务特性
虚拟商品不受库存影响;
虚拟商品不受物流影响,所以所有的商品购买后都即时到账户;
不同区服数据要能互通,但并没有很严格的强一致性要求;
用户买英雄和皮肤的时候同样的英雄和皮肤只能买 1 个,不能重复购买;
用户买鲜花、改名卡之类的道具可以买多个;
业务分级
主要涉及业务有:
用户账号管理
商品管理
用户购买商品
用户充值
按核心程度,优先级为:用户账号管理 > 用户充值 ≈ 用户购买商品 > 商品管理
用户账号管理可复用王者荣耀整体架构,作为商城子系统主要考虑用户充值和用户购买商品业务
数据分类
基础信息
用户信息,全局唯一,不可丢失
商品类
英雄+皮肤,全局唯一,可恢复
其他道具(鲜花、改名卡),可重复,可丢失,可恢复
点券
充值点券:最终一致性,不可丢失;
退还点券:最终一致性,不可丢失;
点券最终一致性设计分析:
对于充值后未到账的情况:本身就是非实时到账,充值界面也应有相应提示知悉用户
对于透支的情况:并没有实物,一切商品皆为“数据”,那么可以在一定金额范围内允许透支。即使用户退游,账号也将闲置,没有任何损失
数据同步
同步方案
数据库同步为主,消息队列同步为辅
商品
商品 ID:每次新建,全局唯一,不会修改,用算法生成,数据库同步+消息队列同步;
商品数据:和商品 ID 绑定,可修改,数据库同步+消息队列同步;
订单
订单 ID:每次新建,全局唯一,不会修改,用算法生成,数据库同步+消息队列同步;
订单数据:和订单 ID 绑定,不会修改,数据库同步+消息队列同步;
充值
账户余额:全局一致性,采用数据库同步,充值只能在归属地充值;
充值记录:每次新建,不会修改,数据库同步即可;
异常处理
充值
无法充值?
支付通道问题,换支付通道
自身服务问题,挂公告。
如果用户在南方机房充值了,没有同步到北方机房怎么办?
最终一致性,请用户等待一段后刷新查看
记录好充值日志,人工恢复
如果用户在北方机房充值消费,记录在临时事务表,等故障恢复后,同步临时事务表
容忍一定程度的透支
购买
如果用户在南方机房购买了英雄/皮肤,没有同步到北方机房,用户在北方机房再次购买怎么办?
多次购买记录,退点券即可
也可以在业务上进行数据合并,只要保证最终一致性即可
如果用户在南方机房购买了非英雄/皮肤商品,没有同步到北方机房,用户在北方机房再次购买怎么办?
同英雄/皮肤方案,在业务上考虑合并数据
整体架构图
版权声明: 本文为 InfoQ 作者【张逃逃】的原创文章。
原文链接:【http://xie.infoq.cn/article/38851d6c7069471a0954bc9e9】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论