# SecKill **Repository Path**: gu-keyang/sec-kill ## Basic Information - **Project Name**: SecKill - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-09-20 - **Last Updated**: 2025-09-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 秒杀系统 (SecKill) ## 项目简介 基于Spring Boot的分布式秒杀系统,采用Redis缓存、RabbitMQ消息队列、MySQL数据库等技术栈,实现高并发场景下的商品秒杀功能。 ## 技术栈 - **后端框架**: Spring Boot 2.x - **数据库**: MySQL 8.0 - **缓存**: Redis 6.x - **消息队列**: RabbitMQ 3.x - **ORM框架**: MyBatis - **构建工具**: Maven - **API文档**: Swagger - **项目结构**: 多模块Maven项目 ## 项目架构 ``` SeckillTest/ ├── sk-common/ # 公共模块 │ ├── bean/ # 统一返回结果 │ ├── config/ # 公共配置 │ ├── constant/ # 常量定义 │ ├── core/ # 核心工具类 │ └── exception/ # 异常处理 ├── sk-main/ # 主业务模块 │ ├── controller/ # 控制器层 │ ├── service/ # 业务逻辑层 │ ├── mapper/ # 数据访问层 │ ├── entity/ # 实体类 │ ├── mq/ # 消息队列处理 │ └── config/ # 业务配置 ├── sk-redis/ # Redis工具模块 └── sk-swagger/ # API文档模块 ``` ## 核心功能 ### 1. 商品缓存预热 - **预热策略**: 系统启动时预加载商品信息到Redis - **布隆过滤器**: 快速判断商品是否存在,避免缓存穿透 - **分布式锁**: 防止缓存击穿,确保只有一个线程查询数据库 - **空对象缓存**: 防止缓存穿透,不存在商品缓存空对象 ### 2. 秒杀按钮控制 - **时间控制**: 活动未开始/已结束时按钮不可点击 - **倒计时显示**: 实时显示活动剩余时间 - **防抖处理**: 防止用户快速多次点击 - **状态管理**: 请求发送后按钮置灰,防止重复提交 ### 3. 库存管理 - **Redis预减库存**: 使用原子操作`decr`命令扣减库存 - **乐观锁控制**: 数据库更新时使用版本号防止超卖 - **库存冻结**: 下单时锁定库存,支付后扣减实际库存 - **库存还原**: 订单取消时还原锁定库存和Redis库存 ### 4. 异步订单处理 - **消息队列**: 使用RabbitMQ解耦下单和订单处理 - **消息可靠性**: - 异步发布确认机制 - 队列和消息持久化 - 手动应答模式确保消息不丢失 - **防重复消费**: 同一用户同一商品只能产生一个订单 - **订单生成**: 异步生成订单数据并冻结库存 ### 5. 订单超时处理 ⭐ **最新优化** - **延迟队列**: 订单创建后1分钟未支付自动取消 - **手动应答模式**: 确保消息处理完成后才确认 - **智能重试机制**: 处理失败时自动重试,最多3次 - **错误处理**: 区分不同错误类型,采用相应处理策略 - **重试队列**: 失败消息延迟30秒后重新处理 ### 6. 限流控制 - **用户限流**: 根据用户ID限制请求频率 - **IP限流**: 根据IP地址限制请求频率 - **设备限流**: 根据MAC地址限制请求频率 - **Redis实现**: 使用Redis计数器实现分布式限流 ### 7. 支付处理 - **库存扣减**: 支付成功后扣减实际库存和冻结库存 - **状态更新**: 更新订单状态为已支付 - **库存同步**: 确保Redis和数据库库存一致性 ## 核心特性 ### 高并发处理 - Redis原子操作确保库存扣减的原子性 - 消息队列异步处理提高系统吞吐量 - 布隆过滤器减少无效数据库查询 ### 防超卖设计 - 多层防护:Redis预减 + 数据库乐观锁 - 原子操作:使用Redis `decr`命令 - 版本控制:数据库更新时检查版本号 ### 可靠性保障 - 手动应答模式确保消息不丢失 - 自动重试机制处理临时故障 - 死信队列处理无法处理的消息 - 详细的异常处理和日志记录 ### 性能优化 - 商品信息缓存预热 - 布隆过滤器快速过滤 - 异步消息处理 - 数据库连接池优化 ## 消息队列设计 ### 队列类型 - **订单队列**: 处理秒杀订单创建 - **延迟队列**: 实现订单超时自动取消 - **死信队列**: 处理超时和失败消息 - **重试队列**: 失败消息重试处理 ### 消息流程 ``` 用户下单 → 订单队列 → 异步处理 → 数据库存储 ↓ 订单创建 → 延迟队列 → 1分钟后 → 死信队列 → 取消订单 ↓ 处理失败 → 重试队列 → 30秒后 → 重新处理 ``` ## 配置说明 ### 数据库配置 ```yaml spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/seckill username: root password: 123456 ``` ### Redis配置 ```yaml spring: redis: host: localhost port: 6379 ``` ### RabbitMQ配置 ```yaml spring: rabbitmq: host: 192.168.207.130 port: 5672 username: admin password: 1357 listener: simple: acknowledge-mode: manual # 手动应答模式 prefetch: 1 # 一次处理一个消息 retry: enabled: true # 启用重试 max-attempts: 3 # 最大重试次数 ``` ## 部署说明 1. **环境准备** - JDK 8+ - MySQL 8.0+ - Redis 6.0+ - RabbitMQ 3.8+ 2. **数据库初始化** ```sql -- 执行 sql/seckill.sql 初始化数据库 ``` 3. **配置修改** - 修改 `application-dev.yml` 中的数据库连接信息 - 修改Redis和RabbitMQ连接信息 4. **启动应用** ```bash mvn clean install java -jar sk-main/target/sk-main-1.0.jar ``` 5. **访问接口** - API文档: http://localhost:8080/swagger-ui.html - 数据库监控: http://localhost:8080/druid ## 监控指标 - 秒杀成功率 - 消息处理性能 - Redis缓存命中率 - 数据库连接池状态 - 消息队列积压情况 - 重试次数和失败率 ## 注意事项 1. **性能调优**: 根据实际业务量调整Redis和RabbitMQ参数 2. **监控告警**: 建议对关键指标设置监控告警 3. **数据一致性**: 定期检查Redis和数据库库存一致性 4. **容量规划**: 根据预期并发量规划服务器资源 ## 更新日志 ### v1.1.0 (最新) - ✅ 优化订单超时处理机制 - ✅ 启用手动应答模式 - ✅ 添加智能重试机制 - ✅ 改进错误处理和日志记录 - ✅ 提升系统可靠性 ### v1.0.0 - ✅ 基础秒杀功能实现 - ✅ Redis缓存预热 - ✅ 异步订单处理 - ✅ 防超卖机制