写点什么

架构实战 7 - 王者荣耀商城异地多活设计

作者:
  • 2023-02-20
    广东
  • 本文字数:1900 字

    阅读完需:约 6 分钟

业务背景

业务数据

  1. 2020.11 月公布数据,全年日均活跃 1 亿,注册玩家数 6 亿,最高同时在线 100 万。

业务功能

  1. 充值:用户充值购买点券,用于在商城中进行消费;

  2. 商品列表:用于展示需要购买的商品,如英雄、皮肤、道具等;

  3. 购买:用户使用点券在商城中购买英雄、皮肤、道具等;

  4. 兑换:用户使用积分、英雄碎片、皮肤碎片在商城中兑换英雄和皮肤;

  5. 礼物:用户可以许愿索要英雄和皮肤,也可以赠送英雄、皮肤、道具给好友;

  6. 夺宝:用户可以使用积分、钻石、玲珑去抽取英雄、皮肤、道具等。

关键业务约束

  1. 用户在购买时,如点券不够,需先进行充值购买点券;

  2. 英雄和皮肤不能重复购买,只能购买一次;

  3. 鲜花、改名卡等道具有数量的概念,可以进行多次购买。


设计步骤

业务分级


  • 用户进商城后的动作为浏览、购买或兑换,包括英雄、皮肤、道具或者其他资源。

  • 用户在进行购买前,先要对购买的商品进行浏览,也有可能用户只是对商品进行浏览,但不进行购买。

  • 在大多数场景下都要利用点券进行购买,点券是用户充值现金所得,这也是商城的主要收入来源

  • 用户在用现金充值时,往往充值的现金数量是平台规定的数量,不能任意充值,完成购买相应资源时,还会有点券剩余,进行其他次数的购买,所以往往是 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),同时考虑到购买动作会比较频繁,购买信息数据量可能会很大,所以购买信息用消息队列进行同步;

  • 用户点券:同充值。


异常处理

商品展示

  1. 商品列表未完全加载,如何加载?

  • 用户找不到所要购买的商品时,重新进入商城或者刷新即可

  1. 已购信息,没有同步到异步机房,用户进行了重复购买,如何处理?

  • 对于英雄和皮肤这类不能重复购买的物品,如果发现重复购买,可以将英雄或皮肤转换成相应数量的碎片;

  • 对于鲜花、改名卡等道具有数量的概念,多买是没有关系的,合并数量就可以了

充值

  1. 用户充值后,点券余额没有同步到异地机房,如何处理?

  • 用户在机房消费都留有记录,等机房恢复,依据充值记录对点券余额进行合并即可

购买

  1. 用户进行购买消费后,点券余额没有同步到异地机房,本地机房挂了,此时点券余额显示的异地机房的数额,此时用户再次进行了消费,会有透支,此时如何处理?

  • 业务上允许一定额度的透支,消费时所在机房会留有记录,等机房恢复时会发现有此类情况,下次充值时,将上次的透支金额抵消掉,实际到账金额为: 充值金额 - 透支金额


  1. 用户在一个机房购买了英雄、皮肤或道具时,遇到了机房故障,用户右到另外一个机房重复购买了英雄、皮肤和道具,此时如何处理?

  • 按“商品展示”第二个问题的解决方案进行处理


王者荣耀异地多活架构示意图



发布于: 刚刚阅读数: 4
用户头像

关注

还未添加个人签名 2018-06-01 加入

还未添加个人简介

评论

发布
暂无评论
架构实战 7 - 王者荣耀商城异地多活设计_架构实战营_源_InfoQ写作社区