动手点关注 干货不迷路 👆
需求背景
春节活动中,多个业务方都有发放优惠券的需求,且对发券的 QPS 量级有明确的需求。所有的优惠券发放、核销、查询都需要一个新系统来承载。因此,我们需要设计、开发一个能够支持十万级 QPS 的券系统,并且对优惠券完整的生命周期进行维护。
需求拆解及技术选型
需求拆解
要配置券,会涉及到券批次(券模板)创建,券模板的有效期以及券的库存信息
要发券,会涉及到券记录的创建和管理(过期时间,状态)
因此,我们可以将需求先简单拆解为两部分:
同时,无论是券模板还是券记录,都需要开放查询接口,支持券模板/券记录的查询。
系统选型及中间件
确定了基本的需求,我们根据需求,进一步分析可能会用到的中间件,以及系统整体的组织方式。
存储
由于券模板、券记录这些都是需要持久化的数据,同时还需要支持条件查询,所以我们选用通用的结构化存储 MySQL 作为存储中间件。
缓存
由于发券时需要券模板信息,大流量情况下,不可能每次都从 MySQL 获取券模板信息,因此考虑引入缓存
同理,券的库存管理,或者叫库存扣减,也是一个高频、实时的操作,因此也考虑放入缓存中
主流的缓存 Redis 可以满足我们的需求,因此我们选用 Redis 作为缓存中间件。
消息队列
由于券模板/券记录都需要展示过期状态,并且根据不同的状态进行业务逻辑处理,因此有必要引入延迟消息队列来对券模板/券状态进行处理。RocketMQ 支持延时消息,因此我们选用 RocketMQ 作为消息队列。
系统框架
发券系统作为下游服务,是需要被上游服务所调用的。公司内部服务之间,采用的都是 RPC 服务调用,系统开发语言使用的是 golang,因此我们使用 golang 服务的 RPC 框架 kitex 进行代码编写。
我们采用 kitex+MySQL+Redis+RocketMQ 来实现发券系统,RPC 服务部署在公司的 docker 容器中。
系统开发与实践
系统设计实现
系统整体架构
从需求拆解部分我们对大致要开发的系统有了一个了解,下面给出整体的一个系统架构,包含了一些具体的功能。
数据结构 ER 图
与系统架构对应的,我们需要建立对应的 MySQL 数据存储表。

本文介绍了如何设计并实现一个支持十万级QPS的券系统,包括需求拆解、技术选型(MySQL、Redis、RocketMQ)、系统开发与实践、大流量场景下的问题及解决方案。在面临存储瓶颈、热点库存和券模板获取失败等问题时,通过分库分表、库存拆分、二级缓存等策略确保系统稳定运行。在实际应用中,系统在13wQPS下表现出高成功率,成功支撑了春节红包发放活动。
最低0.47元/天 解锁文章
2万+

被折叠的 条评论
为什么被折叠?



