资讯-淘券派

实战!如何从零搭建10万级 QPS 大流量、高并发优惠券系统

需求背景

春节活动中,多个业务方都有发放优惠券的需求,且对发券的 QPS 量级有明确的需求。所有的优惠券发放、核销、查询都需要一个新系统来承载。因此,我们需要设计、开发一个能够支持十万级 QPS 的券系统,并且对优惠券完整的生命周期进行维护。

需求拆解及技术选型

需求拆解

  • 要配置券,会涉及到券批次(券模板)创建,券模板的有效期以及券的库存信息
  • 要发券,会涉及到券记录的创建和管理(过期时间,状态)

因此,我们可以将需求先简单拆解为两部分:

同时,无论是券模板还是券记录,都需要开放查询接口,支持券模板/券记录的查询。

系统选型及中间件

确定了基本的需求,我们根据需求,进一步分析可能会用到的中间件,以及系统整体的组织方式。

存储

由于券模板、券记录这些都是需要持久化的数据,同时还需要支持条件查询,所以我们选用通用的结构化存储 MySQL 作为存储中间件。

缓存

  • 由于发券时需要券模板信息,大流量情况下,不可能每次都从 MySQL 获取券模板信息,因此考虑引入缓存
  • 同理,券的库存管理,或者叫库存扣减,也是一个高频、实时的操作,因此也考虑放入缓存中

主流的缓存 Redis 可以满足我们的需求,因此我们选用 Redis 作为缓存中间件。

消息队列

由于券模板/券记录都需要展示过期状态,并且根据不同的状态进行业务逻辑处理,因此有必要引入延迟消息队列来对券模板/券状态进行处理。RocketMQ 支持延时消息,因此我们选用 RocketMQ 作为消息队列。

系统框架

发券系统作为下游服务,是需要被上游服务所调用的。公司内部服务之间,采用的都是 RPC 服务调用,系统开发语言使用的是 golang,因此我们使用 golang 服务的 RPC 框架 kitex 进行代码编写。

我们采用 kitex+MySQL+Redis+RocketMQ 来实现发券系统,RPC 服务部署在公司的 docker 容器中。

系统开发与实践

系统设计实现

系统整体架构

从需求拆解部分我们对大致要开发的系统有了一个了解,下面给出整体的一个系统架构,包含了一些具体的功能。