【Java】如何从零搭建10万级 QPS 大流量、高并发优惠券系统

一、问题分析

👋

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

6.1 需求拆解及技术选型

6.1.1 需求拆解

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

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

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

6.1.2 系统选型及中间件

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

存储

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

缓存

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

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

消息队列

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

系统框架

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

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

6.2 系统开发与实践

6.2.1 系统整体架构

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

6.2.2 数据结构 ER 图

与系统架构对应的,我们需要建立对应的 MySQL 数据存储表。

6.2.3 核心逻辑实现

6.2.3.1 发券:

发券流程分为三部分

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值