05小节:开发用户优惠券分发功能(二)
作者:程序员马丁
热门项目实战社群,收获国内众多知名公司面试青睐,近千名同学面试成功!助力你在校招或社招上拿个offer。
开发用户优惠券分发功能(二),元数据信息:
- 什么是牛券oneCoupon:https://t.zsxq.com/pAWgS
- 代码仓库:https://gitcode.net/nageoffer/onecoupon —— 申请项目权限参考上述牛券项目链接
- 章节难度:★★★★☆ - 很难
- 视频地址:文档先行视频次之
©版权所有 - 拿个offer-开源&项目实战星球专属学习项目,依据《中华人民共和国著作权法实施条例》和《知识星球产权保护》,严禁未经本项目原作者明确书面授权擅自分享至 GitHub、Gitee 等任何开放平台。违者将面临法律追究。
内容摘要:在 v1 版本的基础上,通过引入批处理和保存失败记录的逻辑,大幅提升了业务执行性能,并支持查看 Excel 分发的错误记录。相同的 5000 条记录,v1 版本执行时间约为 1 分钟,而 v2 版本仅需 1 秒,实现了接近 60 倍的性能提升。
课程目录如下所示:
- 业务背景
- Git 分支
- 数据库表涉及
- 重构优惠券分发逻辑
- 记录分发点位
- 重构消息队列执行
- 批量保存用户优惠券
- 保存用户领券失败记录
- 文末总结
业务背景
在上一节中,我们通过 EasyExcel 的方式读取用户分发券 Excel,并将结果保存到了数据和缓存中。如果你刚工作,写之前的代码没问题,如果工作几年或者有全局意识,大家就应该能想到,代码逻辑是有问题的。我梳理了几点内容,大家一起看看:
- 每次都单条方式操作 Redis 和 MySQL,网络成本消耗巨大,应该采用批量的形式执行,能节省大量时间。
- 如果中间应用重启或者宕机,我们还得重新执行,并不符合我们的预期,希望能够从上次执行点位开始。
- 不可能所有用户记录都是分发优惠券成功的,如果说有分发失败的用户记录,应该标记好保存数据库。
- 尽量不要在单个消息消费逻辑中执行太长的业务逻辑,我们应该尽可能的让这个消息执行时长变短。
- 操作完所有用户分发记录后,修改优惠券分发任务的状态和完成时间。
v2 新版本业务逻辑如下:
Git 分支
20240829_dev_coupon-distribute-v2_easyexcel-cache_ding.ma
数据库表设计
新增的表用于记录分发过程中因优惠券库存不足或用户已领取等原因导致的失败记录。这些记录会生成错误 Excel 文件,交付给前端展示,方便业务人员查看失败用户及失败原因。
进入 one_coupon_rebuild_0
数据库,执行下述 SQL。
CREATE TABLE `t_coupon_task_fail` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`batch_id` bigint(20) DEFAULT NULL COMMENT '批次ID',
`json_object` text COMMENT '失败内容',
PRIMARY KEY (`id`),
KEY `idx_batch_id` (`batch_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='优惠券模板发送任务失败记录表';
重构优惠券分发逻辑
因为代码逻辑整体比较耦合,所以我们将整体代码奉上,并在接下来的小节中逐个解析其中的核心业务逻辑和优化。其中优化逻辑主要涉及两个类:ReadExcelDistributionListener
和 CouponExecuteDistributionConsumer
。
其中一些细节处使用了较多小技巧,看下文细细道来。