架构实战营 - 模块七 - 作业
【背景】
假设现在决定要实现王者荣耀里边商城的异地多活架构,请你分析一下。
【业务功能】
充值点券、购买英雄、皮肤、道具
【业务约束】
登录用户才能购买
用户需要先通过微信钱包或者 QQ 钱包充值购买点券,用点券再支付
同样的英雄和皮肤只能购买一个,不可重复
鲜花、改名卡、遗忘之水等道具卡可以买多个
虚拟物品商城与实物电商的两个区别:1)没有库存的概念,因此设计的时候在一致性这一部分处理就简单很多;2)有发货但是没有物流的概念,也就是说用户购买虚拟物品后,商城同步信息给用户的区服即可
调用微信钱包和 QQ 钱包充值的时候,支付本身高可用不需要商城自己实现;
用户的点券看起来是强一致性的数据,但实际上是可以允许一定额度的透支的因为两个原因:1)没有实物发货,不用担心被薅羊毛;2)充值点券后不能提现;3)如果用户在异地多活场景透支,那么恢复后是可以发现的,而且用户也不会因为这点毛头小利退游,因为一旦退游,他充的钱都浪费了;
买英雄和皮肤业务约束不能重复购买,但其实用户买了一个英雄后,遇到机房故障,到另外一个机房再买一个是可以的,这个异常场景的用户很少,如果有的话,将英雄熟练度和经验值合并就可以了
鲜花、改名卡等道具有数量的概念,多买是没有关系的,合并数量就可以了;
整体方案其实用数据库同步 + 消息队列同步就够了,再加上述说的几个业务上的异常处理。其中数据库同步用于异地机房同步订单数据,消息队列用于将购买信息同步给区服服务器
【数据分类】
1、充值
依赖 QQ 钱包、微信钱包、ios 账户授权支付,依赖登录信息
RoleID: 登录后就不会变了
授权 ID: 每次新建,全局唯一,不会修改
充值 ID: 每次新建,全局唯一,不会修改
点券余额:强一致性、不可丢失、不可恢复
2、消费
消费点券:强一致性、不可丢失、不可恢复、数据修改大
RoleID: 登录后就不会变了
支付 ID:只会新增、全局唯一
消费记录:
1)英雄或皮肤 --> RoleID+英雄 ID 或皮肤 ID 全局唯一
2)道具:---> RoleID+道具 ID -->可重复
【数据同步】
1、充值
RoleID、授权 ID、充值 ID 只会新增不会修改 数据库同步+消息队列
点券余额:数据库同步
2、消费
RoleID、支付 ID 只会新增不会修改 数据库同步+消息队列
点券余额:数据库同步
消费记录:购买英雄和皮肤数据 数据库同步+消息队列
购买道具数据:数据库同步
【异常处理】
1、库存
如果采用单点部署,库存服务挂掉,提示用户稍后再试。
2、购买物品
用户购买完某些物品,没有同步到异地机房,提示用户稍后再试,或者进行二次读取,去另外一个机房读取。
【架构设计】
![](https://static001.geekbang.org/infoq/bb/bb3aa2596c17cadae16b4b4d17dc48f8.jpeg?x-oss-process=image%2Fresize%2Cp_80%2Fauto-orient%2C1)
![](https://static001.geekbang.org/infoq/6b/6b32b233a2a2724946285d6f2ed7ee71.png)
评论