oneCoupon牛券优惠系统
作者:程序员马丁
热门项目实战社群,收获国内众多知名公司面试青睐,近千名同学面试成功!助力你在校招或社招上拿个offer。
什么是 oneCoupon 牛券?
oneCoupon 寓意为一个优惠券系统,同时起了个代号叫做牛券。
牛券是一款高性能优惠券系统,与其他网上优惠券系统不同,牛券能够承受近十万次查询和分发请求的高并发压力。
项目旨在帮助校招和社招的同学掌握足够的亮点,为获得理想的 offer 助力。此次代码实现非常优雅,甚至细致到参数定义都蕴含深意,值得大家学习借鉴。
其中的一些亮点部分已重点标记,大家可根据实际情况学习即可。该图会持续更新。
业务架构
从优惠券的业务属性上来说,每个平台都离不开优惠券,优惠券又分为平台券和店铺券,在此之上券类型分为折扣券、满减券以及立减券。当然,优惠券的领取和使用同样具有限制,详情如下:
下方的业务架构图全面描述了项目的服务集合、组件库列表和基础设置层等要素,有助于用户快速了解牛券平台的顶层设计和业务细节,从零到一进行构建。
能力层部分虽然涵盖了多个问题解决方案,但与整个项目的亮点相比,这部分内容并非全面展示。随着学习的深入,大家将能够更清楚地理解和掌握这些内容,并从中获得更多的实际应用能力。
技术架构
我们选择了基于 Spring Boot 3 和 JDK17 进行底层建设,同时组件库的版本大多也是最新的。这样做既能享受新技术带来的性能提升,也能体验到新特性带来的惊喜。
如果用一张图来概括牛券的技术架构,其展现形态如下图所示。
技术架构涵盖了 SpringBoot 3、SpringCloudAlibaba、Nacos、Sentinel、Skywalking、RocketMQ 5.x、ElasticSearch、Redis、MySQL、EasyExcel、XXL-Job、Redisson 等技术。
学习项目需要什么前置技术?
虽然上面的技术点用到的很多,但是很多只是知道框架是做什 么,会使用 API 即可满足开发条件,不需要深入原理。所以看着技术点比较多,但是上手必须的框架技术却很少。
其实强依赖的只有
分布式缓存 Redis
、消息队列 RocketMQ
,其他大家都不需要刻意学习,课程讲的过程当中会说明。
从项目学习的角度上,大家需要至少做过一个 SpringBoot 项目,比如点评、外卖或者 SaaS 短链接。掌握了基本开发流程,就可以上手开始项目。
另外星球提供了 Redis 和 RocketMQ 的云中间件服务,大家可以直接使用。你只需在本地启动一个 5.7.x 版本的 MySQL,就可以开始项目学习了!
项目质量怎么样?
1. 兑换/秒杀优惠券
项目里没点秒杀逻辑,都不好意思说是高并发系统。在牛券中自然也是会存在的,针对高频优惠券会有较热的流量。
秒杀的类型也不是一成不变的,牛券中利用了两种完全不同的秒杀方式,并且详细介绍了两者的区别和对应的优惠券,让大家能够在合适的业务使用适合的架构方案。
2. 分发用户优惠券
为应对平台和商家的销售额提升,平台通过批量发送优惠券的方式主动推送给用户。我们开发了基于 Excel 文件的优惠券分发功能。考虑到常规的 Excel 文件解析常常导致内存占用过高和 OOM(内存溢出)问题,我们采用了 EasyExcel 解决方案以高效完成此功能。
并且 v1 版本业务分发逻辑中会通过默认的单条数据分发,然后再演变成 v2 批量分发,让大家直观看到这个过程中各自的性能差距。
3. 创建优惠券模板
很多同学都说后台增删改查没什么技术含量,在我看来其实并不是。
以创建优惠券模板举例,这是商家用户在后管平台里简单的一个创建流程,基本上算不上并发,但是会涉及到责任链设计模式、优雅记录操作日志、缓存预热等逻辑。如果把这些技能学会,可以很好应用到自己项目当中,增加代码的健壮性和可扩展。
4. 分库分表
现阶段但凡上点体量的公司,都得在分库分表和分布式数据库上进行抉择。相对于分布式数据库而言,我个人认为可能会有以下的不足,以下说法谨代表我个人看法:
-
兼容性:部分分布式数据库并不能 100%兼容 MySQL,导 致业务无法平滑迁移。
-
技术储备:需要有这方面的分布式数据库专家,平常使用谁都可以,线上出现了问题不知道怎么解决才是致命。
-
使用成本:阿里云和腾讯云没有开源版本,付费版本相对于 MySQL 成本偏高。TiDB 开源版本 Issue BUG 较多,商业未知。
所以,类似于以 ShardingSphere 为代表的分库分表框架依然抗打。我们在牛券里会大量应用,不仅局限于分表,更会和大家操作分库逻辑,让大家能更好的接收相关知识。
5. 防重复提交
如果涉及到多场景通用代码,写到业务里只是第一步,更重要的是能够掌握抽象的能力,SpringAOP 和注解相关的知识就必不可少。我们在文档和视频讲解的时候,先讲如何写到业务,然后再抽象到基础组件 SpringBoot Starter 中。
我们不仅会写功能代码,而且在一些具有代表性功能里,通过 Jmeter 和单元测试的方式给大家演示怎么出现的问题,以及复现出来。通过这种形式,可以更好的掌握系统在实际业务当中可能会出现的问题。
6. 解析 Excel 行数
很多项目是以讲解功能为目的,比如说只讲解怎么使用 EasyExcel 解析和写入 Excel 文件,而不说为什么要使用?
在牛券这个项目中,会先通过市场上主流的框架进行铺垫,讲解有什么样的问题,再说出最终方案的优点是什么。以下文举例,两个不同框架解析 100w 行记录的 Excel,获取行数功能,竟然存在如此大的性能差异。
7. 更多亮点
在这里简单列一下,就不再展开说了,其他非完全统计亮点如下:
- 缓存击穿、穿透:绝对企业级解决方案,基本上牛券里的方案可以说是在当下环境下最为合适的。
- 幂等逻辑:针对 Web 端 API 接口防重复提交,以及针对消息队列的防止重复消费,会给大家掰开揉碎进行讲解。
- 线上配置:用个 Redis 默认配置跑个 Demo 以为这就是全部,其实大错特错,会在牛券里讲解最适合项目的淘汰策略等。
- ......
这次牛券的项目质量是我付出很多精力打磨的,相信它会是继 12306 铁路购票、SaaS 短链接之后的面试新宠项目。