一、项目背景与需求分析
在电商行业,优惠券是提升用户转化率、促进复购的核心营销工具。亿级流量场景下,系统需同时满足高并发(如大促期间每秒数万请求)、低延迟(响应时间<200ms)、高可用(99.99% SLA)三大核心需求。典型业务场景包括:用户领取优惠券、核销优惠券、优惠券状态同步、优惠券过期回收等。
技术挑战集中在三点:一是数据一致性,需保证优惠券发放、使用、回收的原子性;二是性能瓶颈,单表千万级数据下查询效率需优化;三是分布式环境下的故障恢复能力。
二、系统架构设计
1. 分层架构设计
采用经典三层架构:
- 接入层:Nginx负载均衡 + 限流组件(Sentinel),支持横向扩展。
- 业务层:Spring Cloud微服务架构,拆分为优惠券模板服务、用户券包服务、核销服务。
- 数据层:MySQL分库分表(ShardingSphere)+ Redis集群(主从+哨兵模式)。
关键设计点:
- 服务解耦:通过领域驱动设计(DDD)划分边界,例如将“优惠券模板”与“用户券包”拆分为独立服务。
- 异步化:使用RocketMQ实现领取记录的最终一致性,避免同步调用超时。
2. 数据库设计
- 分库分表策略:按用户ID哈希分库(4库),按时间分表(每月1表),单表数据量控制在500万以内。
- 索引优化:对
user_id、coupon_id、status字段建立复合索引,避免全表扫描。 - 冷热分离:历史过期券数据归档至ES,减少主库压力。
示例SQL:
-- 创建分表(按月)CREATE TABLE coupon_202310 (id BIGINT PRIMARY KEY AUTO_INCREMENT,user_id BIGINT NOT NULL,coupon_id VARCHAR(32) NOT NULL,status TINYINT DEFAULT 0 COMMENT '0-未使用 1-已使用 2-已过期',create_time DATETIME DEFAULT CURRENT_TIMESTAMP,INDEX idx_user_status (user_id, status)) ENGINE=InnoDB;
三、核心功能实现
1. 高并发领取优化
- 分布式锁:使用Redisson实现券模板领取的互斥,防止超发。
RLock lock = redissonClient.getLock("coupon_template_lock_" + templateId);try {if (lock.tryLock(10, 30, TimeUnit.SECONDS)) {// 检查库存并扣减if (templateStock > 0) {// 发放优惠券}}} finally {lock.unlock();}
- 队列削峰:通过RocketMQ异步处理领取请求,消费者端批量插入数据库。
2. 实时核销设计
- 双写一致性:核销时同时更新MySQL和Redis,通过事务消息保证最终一致。
- 缓存预热:大促前将热门优惠券数据加载至Redis,减少穿透。
3. 过期策略实现
- 定时任务:使用Elastic-Job分片扫描即将过期的券,提前触发提醒。
- Redis键空间通知:监听TTL事件,实时回收过期券。
四、性能优化实践
1. 缓存策略
- 多级缓存:本地Cache(Caffeine)+ 分布式Cache(Redis),热点数据本地缓存命中率>90%。
- 缓存雪崩防护:对同一批过期的键添加随机过期时间(1-5分钟偏差)。
2. 数据库优化
- 读写分离:主库写,从库读,通过MyCat实现自动路由。
- 批量操作:使用MyBatis的
foreach标签实现批量插入,TPS提升3倍。<insert id="batchInsert">INSERT INTO user_coupon (user_id, coupon_id) VALUES<foreach collection="list" item="item" separator=",">(#{item.userId}, #{item.couponId})</foreach></insert>
3. 连接池调优
- HikariCP配置:设置
maximum-pool-size=50,connection-timeout=30000,避免连接泄漏。
五、安全与容灾设计
1. 防刷机制
- IP限流:对同一IP的领取请求限制为10次/分钟。
- 行为画像:通过设备指纹识别机器行为,拦截异常请求。
2. 数据一致性保障
- TCC事务:核销场景采用Try-Confirm-Cancel模式,确保资金安全。
- 审计日志:记录所有关键操作(发放、使用、删除),便于追溯。
3. 灾备方案
- 异地多活:主中心(杭州)处理写请求,备中心(北京)同步读请求,通过MQ实现数据同步。
- 熔断降级:使用Hystrix监控服务依赖,当第三方服务(如支付)故障时自动降级。
六、监控与运维
1. 指标监控
- Prometheus + Grafana:监控QPS、响应时间、错误率等核心指标。
- 自定义告警:当错误率>1%或响应时间>500ms时触发钉钉告警。
2. 日志分析
- ELK栈:收集业务日志,通过Kibana分析优惠券使用路径。
- 慢查询监控:对MySQL中执行时间>1s的SQL进行告警。
七、总结与展望
本系统通过分层架构、分库分表、异步化等手段,成功支撑了亿级流量场景下的优惠券业务。未来可进一步探索:
- Serverless架构:使用函数计算(FC)处理突发流量。
- AI预测:基于用户行为预测优惠券领取概率,优化库存分配。
- 区块链存证:将核销记录上链,增强公信力。
开发亿级流量系统需兼顾技术深度与业务理解,建议从MVP(最小可行产品)开始,逐步迭代优化。