架构实战 7 - 王者荣耀商城异地多活设计
业务背景
业务数据
2020.11 月公布数据,全年日均活跃 1 亿,注册玩家数 6 亿,最高同时在线 100 万。
业务功能
充值:用户充值购买点券,用于在商城中进行消费;
商品列表:用于展示需要购买的商品,如英雄、皮肤、道具等;
购买:用户使用点券在商城中购买英雄、皮肤、道具等;
兑换:用户使用积分、英雄碎片、皮肤碎片在商城中兑换英雄和皮肤;
礼物:用户可以许愿索要英雄和皮肤,也可以赠送英雄、皮肤、道具给好友;
夺宝:用户可以使用积分、钻石、玲珑去抽取英雄、皮肤、道具等。
关键业务约束
用户在购买时,如点券不够,需先进行充值购买点券;
英雄和皮肤不能重复购买,只能购买一次;
鲜花、改名卡等道具有数量的概念,可以进行多次购买。
设计步骤
业务分级
用户进商城后的动作为浏览、购买或兑换,包括英雄、皮肤、道具或者其他资源。
用户在进行购买前,先要对购买的商品进行浏览,也有可能用户只是对商品进行浏览,但不进行购买。
在大多数场景下都要利用点券进行购买,点券是用户充值现金所得,这也是商城的主要收入来源。
用户在用现金充值时,往往充值的现金数量是平台规定的数量,不能任意充值,完成购买相应资源时,还会有点券剩余,进行其他次数的购买,所以往往是 1 次充值多次购买。
兑换英雄或皮肤时,往往要积累很多的碎片,这往往需要耗费很长时间,相对于充值购买的频率就会少很多。
同样,索要或赠送礼物和夺宝的频率也会小很多。
业务分级结果:商品展示 > 购买 >= 充值 > 兑换、礼物、夺宝
所以商城的核心业务确定为:商品展示、购买、充值
数据分类
商品展示
RoleID:微信、QQ 授权登录或者其他形式(如苹果账号登录)会返回给王者荣耀全局唯一 RoleID,登录后就不会变了;
商品 ID:全局唯一,不会修改,每次有新商品上架时,新商品 ID 都会用算法生成;
已购商品 ID:和 RoleID 绑定,用户不能修改,用数据库同步。
充值
RoleID:同商品展示,全局唯一,登录后就不会变了;
充值订单 ID:每次新建,全局唯一,不可变;
充值订单数据:和订单 ID 绑定,只会新建,不会修改,主要信息为:RoleId、充值渠道、充值金额、充值时间、订单状态等等;
用户点券:强一致性,修改频率会比较大。
购买
RoleID:同商品展示,全局唯一,登录后就不会变了;
购买订单 ID:每次新建,全局唯一,不可变;
购买信息:和购买订单 ID 绑定,单次的购买信息不会进行修改,主要信息为:RoleId、商品 ID、商品数量、消耗点券、购买时间、订单状态;
用户点券:同充值,修改频率会比较大。
数据同步
商品展示
RoleID:全局唯一,和区服对应关系,只会新建不会修改,采用数据库同步;
商品 ID:全局唯一,不可变,每次有新商品上架时,新商品 ID 都会用算法生成,数据库同步即可;
已购商品 ID:和 RoleID 绑定,用户不能修改,用数据库同步。
充值
RoleID:同商品展示;
充值订单 ID:每次新建,全局唯一,不可变,用算法生成,数据库同步即可;
充值订单数据:和订单 ID 绑定,不可变,数据库同步即可;
用户点券:由于点券余额会存在充值和消费两种情况,也就是加和减两种情形,不满足幂等性要求,使用数据库同步。
购买
RoleID:同商品展示;
购买订单 ID:每次新建,全局唯一,不可变,用算法生成,使用消息队列进行同步;
购买信息:和购买订单 ID 绑定,由于具有数量概念的相同物品,多次购买可以进行合并,和时序性无关(例如 A 物品第一次购买数量为 m,第二次购买数量为 n,同步时,不管是先同步哪个数量,最后得到的结果都会是 m + n),同时考虑到购买动作会比较频繁,购买信息数据量可能会很大,所以购买信息用消息队列进行同步;
用户点券:同充值。
异常处理
商品展示
商品列表未完全加载,如何加载?
用户找不到所要购买的商品时,重新进入商城或者刷新即可
已购信息,没有同步到异步机房,用户进行了重复购买,如何处理?
对于英雄和皮肤这类不能重复购买的物品,如果发现重复购买,可以将英雄或皮肤转换成相应数量的碎片;
对于鲜花、改名卡等道具有数量的概念,多买是没有关系的,合并数量就可以了。
充值
用户充值后,点券余额没有同步到异地机房,如何处理?
用户在机房消费都留有记录,等机房恢复,依据充值记录对点券余额进行合并即可
购买
用户进行购买消费后,点券余额没有同步到异地机房,本地机房挂了,此时点券余额显示的异地机房的数额,此时用户再次进行了消费,会有透支,此时如何处理?
业务上允许一定额度的透支,消费时所在机房会留有记录,等机房恢复时会发现有此类情况,下次充值时,将上次的透支金额抵消掉,实际到账金额为: 充值金额 - 透支金额
用户在一个机房购买了英雄、皮肤或道具时,遇到了机房故障,用户右到另外一个机房重复购买了英雄、皮肤和道具,此时如何处理?
按“商品展示”第二个问题的解决方案进行处理
王者荣耀异地多活架构示意图
版权声明: 本文为 InfoQ 作者【源】的原创文章。
原文链接:【http://xie.infoq.cn/article/da42446000bc11fb71916144c】。文章转载请联系作者。
评论