项目背景
通过分享链接到朋友圈、微信群进行锁粉,当被锁粉对象消费后,会通过比例返佣给分享链接的用户。
问题描述
点击链接进入的用户,因为业务处理过长,出现响应超时情况,导致系统吞吐量过低、甚至出现点击链接后用户锁粉失败的情况。
业务分析
调用步骤:
- 需要获取微信用户信息。
- 计算上级用户的粉丝数量。
- 同时统计当天新增用户。
- 微信头像会过期,需要将图片同步到对象存储。
- ….
非业务分析
高性能
按照目前用户新增的速度来看,每秒TPS大约在15。
用户获取信息相关QPS大约为500。
高可用
用户在分享链接时候不允许出现点击锁定粉失败。
同时在运营后台需要得知当天新增用户。
可扩展性
支持水平扩展。
评估结果
功能性:解决业务发展带来的系统耦合、迭代缓慢问题。
非功能性:要解决系统新增用户的高可用、查询用户的高性能。
通过经验值计算高峰时期= 平时峰值 * 4,来计算新增与查询用户性能指标:
- 新增用户(TPS) * 4 = 60 , 采用异步形式MQ(Kafka,rabbitMQ)/Redis(pub/sub,lpush/rpop)/JVM+Mysql进行处理。
- 查询用户(QPS) * 4 = 2000,qps不高,可以通过通过水平部署2台避免单点。
技术实现考量
异步
- Kafka集群,支持高可用:
- 生产者:可用通过ack参数来确定消息推送集群各个broker中的副本。每个topic可以配置副本数量。
- 消费者:可以通过扩展分区进行多消费者进行消费,并且可以在在业务完成后提交事物。同样的消息即使消费后,也可以通过修改group-id进行重复消费。
- Redis哨兵,支持高可用
- JVM队列,不支持高可用
保障100%不丢消息:
- 定时轮询:数据写入MQ后同时写入Mysql,并加入状态字段。
- 消费确认:数据消费后,提交事物,同时更新数据库中的状态。