王者荣耀商城异地多活架构设计
一、业务分级
已经限定了要对商城功能做异地多活,因此这一步可以忽略。
二、数据分类
1、RoleID:登录后就不会变了
2、商品 ID:每次上新品,新创建商品,商品 ID 全局唯一,不会修改
3、商品库存:虚拟物品,不存在库存限制,不需要这个数据
4、订单 ID:每次购买,生成订单 ID,全局唯一,不会修改
5、点券余额:强一致
6、拥有的英雄和皮肤:强一致
三、数据同步
1、RoleID:RoleID 和区服对应关系,只会新建不会修改,数据库同步即可
2、商品 ID:每次上新品,新创建商品,商品 ID 全局唯一,不会修改,使用算法生成,数据库同步即可
3、订单 ID:每次购买,生成订单 ID,全局唯一,不会修改,使用算法生成,数据库同步即可
4、点券余额:数据要求强一致性,不可丢失,为了保证异常情况下可以购买,可以采用临时余额表的方式,先要求充值再消费,等故障恢复后同步最新余额,使用数据库+消息队列同步数据。
5、拥有的英雄和皮肤:数据要求强一致性,不可丢失,可以采取判断订单是否不重复但是拥有相同的英雄或皮肤,做回退处理,使用数据库+消息队列同步数据。
四、异常处理
1、当购买过程中系统挂掉怎么办?
一般支付宝和微信都有消息回查接口,记录号中间状态,中间状态和订单一起生成,保证事务,如果出现故障,恢复后要对中间状态数据做结果回查。
2、购买完成后订单数据没有同步,看不到已拥有的英雄怎么办?
等恢复了再看
3、购买完成后订单数据没有同步,看不到已拥有的英雄,重复购买怎么办?
可以采用临时记录表,记录在系统故障期间对于只能购买一次商品的记录,等系统恢复后,通过消息队列的方式同步到其他 IDC,其他 IDC 判断是否重复,不重复就入库,如果重复,可以选以第一次为准还是以最后一次为准,删除多余订单,增加对应余额
4、购买完成后或者充值完成后余额没有同步,余额数据不确定怎么办?
为了保证余额正确和玩家正常购买需求,可以使用临时表,记录系统故障期间的余额变动,消费使用的点券都是来自于临时表,待系统恢复后,通过消息队列将数据同步到故障恢复的 IDC,从故障中恢复的 IDC 将余额数据汇总后,通过数据库同步数据。
五、异地多活架构示意图
评论