# 秒杀系统设计 ## 需求分析和数据量评估 ### 需求分析 - **核心功能**:商品秒杀、库存管理、下单支付、用户限流 - **业务场景**:双十一、618等大促活动,商品短时间内高并发抢购 - **QPS评估**:假设10万用户同时抢购,QPS可达10万+ - **峰值预期**:高峰期QPS可达50万+ - **数据规模**:商品10万+,用户1000万+,订单日峰值1亿+ ### 数据量评估 - **商品表**:10万条,日均查询100万次 - **库存表**:10万条,秒杀期间读写10万+/秒 - **订单表**:日峰值1亿条,历史数据10亿+ - **用户表**:1000万条,日均查询500万次 - **Redis缓存**:商品信息100万条,库存信息10万条 ## 核心技术难点 ### 1. 高并发库存管理 - 传统数据库锁无法支撑高并发 - 需要分布式锁配合缓存实现 - 库存扣减的原子性问题 ### 2. 超卖问题 - 库存与订单不一致 - 需要最终一致性保证 - 重复下单处理 ### 3. 限流策略 - 全局限流、用户限流、商品限流 - 限流算法选择(令牌桶、漏桶) - 限流后的用户体验 ### 4. 数据一致性 - 缓存与数据库的一致性 - 分布式事务处理 - 幂等性保证 ## 系统架构设计 ### 总体架构 ``` ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ CDN/Static │ │ Load Balance │ │ API Gateway │ │ Cache │◄──►│ (Nginx) │◄──►│ (Gateway) │ └─────────────────┘ └─────────────────┘ └─────────────────┘ │ ┌───────────────────────────────────┼───────────────────────────────────┐ │ │ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ 业务服务 │ │ 业务服务 │ │ 业务服务 │ │ (微服务) │ │ (微服务) │ │ (微服务) │ └─────────────────┘ └─────────────────┘ └─────────────────┘ │ │ │ └───────────────────────────────────┼───────────────────────────────────┘ │ ┌───────────────────────────────────┼───────────────────────────────────┐ │ │ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ Redis集群 │ │ 消息队列 │ │ 数据库集群 │ │ (缓存+分布式锁)│ │ (Kafka/RocketMQ)│ │ (MySQL分库分表)│ └─────────────────┘ └─────────────────┘ └─────────────────┘ ``` ### 关键组件 #### 1. 流量层 - **CDN**:静态资源加速 - **Web服务器**:Nginx负载均衡 - **API网关**:限流、路由、认证 #### 2. 服务层 - **秒杀服务**:核心业务逻辑 - **订单服务**:订单处理 - **库存服务**:库存管理 - **支付服务**:支付处理 #### 3. 存储层 - **Redis集群**:缓存和分布式锁 - **数据库集群**:MySQL分库分表 - **消息队列**:异步处理 #### 4. 监控层 - **监控系统**:实时监控 - **告警系统**:异常告警 - **日志系统**:业务日志 ## 数据库设计 ### 商品表 ```sql CREATE TABLE `seckill_product` ( `id` bigint NOT NULL AUTO_INCREMENT, `product_id` bigint NOT NULL COMMENT '商品ID', `product_name` varchar(255) NOT NULL COMMENT '商品名称', `product_desc` text COMMENT '商品描述', `original_price` decimal(10,2) NOT NULL COMMENT '原价', `seckill_price` decimal(10,2) NOT NULL COMMENT '秒杀价', `stock_count` int NOT NULL COMMENT '库存数量', `seckill_count` int NOT NULL DEFAULT 0 COMMENT '已秒杀数量', `start_time` datetime NOT NULL COMMENT '开始时间', `end_time` datetime NOT NULL COMMENT '结束时间', `status` tinyint NOT NULL DEFAULT 1 COMMENT '状态', `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_product_id` (`product_id`), KEY `idx_start_time` (`start_time`), KEY `idx_end_time` (`end_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ``` ### 订单表 ```sql CREATE TABLE `seckill_order` ( `id` bigint NOT NULL AUTO_INCREMENT, `order_no` varchar(64) NOT NULL COMMENT '订单号', `user_id` bigint NOT NULL COMMENT '用户ID', `product_id` bigint NOT NULL COMMENT '商品ID', `product_name` varchar(255) NOT NULL COMMENT '商品名称', `seckill_price` decimal(10,2) NOT NULL COMMENT '秒杀价', `status` tinyint NOT NULL DEFAULT 0 COMMENT '状态', `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_order_no` (`order_no`), KEY `idx_user_id` (`user_id`), KEY `idx_product_id` (`product_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ``` ### 用户表 ```sql CREATE TABLE `seckill_user` ( `id` bigint NOT NULL AUTO_INCREMENT, `user_id` bigint NOT NULL COMMENT '用户ID', `username` varchar(50) NOT NULL COMMENT '用户名', `email` varchar(100) NOT NULL COMMENT '邮箱', `phone` varchar(20) NOT NULL COMMENT '手机号', `status` tinyint NOT NULL DEFAULT 1 COMMENT '状态', `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_user_id` (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ``` ## 缓存策略 ### Redis缓存设计 ```typescript // 商品信息缓存 const PRODUCT_CACHE_PREFIX = 'product:'; const PRODUCT_CACHE_TTL = 3600; // 1小时 // 库存缓存 const STOCK_CACHE_PREFIX = 'stock:'; const STOCK_CACHE_TTL = 300; // 5分钟 // 分布式锁 const LOCK_PREFIX = 'lock:'; const LOCK_TTL = 10; // 10秒 // 用户限流 const RATE_LIMIT_PREFIX = 'rate_limit:'; const RATE_LIMIT_TTL = 1; // 1秒 ``` ### 缓存策略 1. **多级缓存**: - CDN缓存静态资源 - Redis缓存热点数据 - 本地缓存减少网络IO 2. **缓存更新策略**: - 主动更新:秒杀开始前预加载 - 异步更新:异步刷新数据库 - 失效策略:设置合理的TTL 3. **缓存预热**: - 秒杀开始前加载商品信息 - 预热库存信息到Redis - 预加载热门商品 ### 分布式锁实现 ```java public boolean acquireDistributedLock(String lockKey, String requestId, long expireTime) { String result = redisTemplate.opsForValue().set( lockKey, requestId, expireTime, TimeUnit.MILLISECONDS ); return "OK".equals(result); } public boolean releaseDistributedLock(String lockKey, String requestId) { String script = "if redis.call('get', KEYS[1]) == ARGV[1] then " + "return redis.call('del', KEYS[1]) " + "else " + "return 0 " + "end"; Long result = redisTemplate.execute(new DefaultRedisScript<>(script, Long.class), Collections.singletonList(lockKey), requestId); return result != null && result > 0; } ``` ## 扩展性考虑 ### 1. 水平扩展 - **无状态服务**:服务实例可以水平扩展 - **数据分片**:按商品ID分片 - **读写分离**:主库写入,从库读取 ### 2. 垂直扩展 - **服务拆分**:按业务域拆分微服务 - **数据分层**:热数据、温数据、冷数据分离 - **缓存层扩展**:Redis集群扩容 ### 3. 异步处理 - **消息队列**:订单处理异步化 - **事件驱动**:使用事件总线 - **最终一致性**:保证数据最终一致 ### 4. 容灾备份 - **多活架构**:多机房部署 - **故障转移**:自动故障检测和转移 - **数据备份**:定时备份和实时同步 ## 实际项目经验 ### 1. 技术栈选择 - **前端**:Vue.js + React - **后端**:Spring Boot + Node.js - **数据库**:MySQL + Redis - **缓存**:Redis Cluster - **消息队列**:Kafka - **监控**:Prometheus + Grafana ### 2. 性能优化 - **JVM调优**:调整堆大小和GC策略 - **MySQL优化**:索引优化、慢SQL优化 - **Redis优化**:集群扩容、内存优化 - **网络优化**:连接池配置、超时设置 ### 3. 运维部署 - **容器化**:Docker + Kubernetes - **CI/CD**:Jenkins + GitLab - **监控告警**:ELK Stack + AlertManager - **压测工具**:JMeter + Locust ### 4. 灰度发布 - **蓝绿部署**:无缝切换 - **金丝雀发布**:逐步放量 - **流量控制**:按比例分配流量 ## 阿里P7加分项 ### 1. 架构设计能力 - **高可用架构**:设计99.99%可用性的系统 - **高性能架构**:支持百万级QPS - **高扩展架构**:支持弹性扩缩容 ### 2. 技术深度 - **分布式事务**:Seata、TCC、Saga - **分布式缓存**:Redis集群、一致性哈希 - **分布式锁**:Redis、Zookeeper、Etcd ### 3. 业务理解 - **电商业务**:理解秒杀业务场景 - **用户行为**:分析用户抢购习惯 - **风控系统**:防刷、防作弊机制 ### 4. 团队管理 - **技术团队**:带领10人+技术团队 - **项目管控**:管理千万级用户项目 - **技术方案评审**:评审核心技术方案 ### 5. 前沿技术 - **Serverless**:秒杀函数化 - **云原生**:K8s微服务架构 - **AI应用**:智能推荐、风控 ## 面试常见问题 ### 1. 秒杀系统如何防止超卖? - 使用Redis预减库存 - 分布式锁控制并发 - 数据库唯一约束 - 消息队列异步处理 ### 2. 如何实现限流策略? - 令牌桶算法 - 漏桶算法 - Redis计数器 - Nginx限流模块 ### 3. 分布式锁的实现方式? - Redis RedLock - Zookeeper - Etcd - 数据库悲观锁 ### 4. 如何保证数据一致性? - 最终一致性 - 消息队列补偿 - 定时任务对账 - 幂等性设计 ### 5. 秒杀系统的瓶颈在哪里? - 库存查询 - 下单逻辑 - 支付处理 - 库存同步