去年参与某头部电商平台秒杀系统重构时,我们团队基于Spring Boot+Kafka+Redis的技术栈实现了每秒3万笔订单的稳定处理。这个过程中积累的实战经验,或许能帮你少走弯路。
电商秒杀场景本质上是在解决"三高"问题:
我们的分层设计如下(数字表示QPS能力):
code复制用户层 → 接入层(50万) → 服务层(5万) → 存储层(3万)
(静态化+CDN) (Nginx集群) (Spring Boot) (Redis+Kafka+MySQL)
特别注意:Redis一定要用集群版,单机版在压力测试时出现了连接数爆满的问题
java复制// Redis预减库存Lua脚本
String script = "if redis.call('exists',KEYS[1])==1 then" +
" local stock=tonumber(redis.call('get',KEYS[1]));" +
" if stock>0 then" +
" redis.call('decrby',KEYS[1],1);" +
" return stock-1;" +
" end;" +
" return -1;" +
"end;" +
"return -2;";
| 参数 | 默认值 | 优化值 | 效果提升 |
|---|---|---|---|
| tcp-keepalive | 300 | 60 | 连接复用 |
| maxmemory-policy | noeviction | volatile-lru | 内存控制 |
| hz | 10 | 100 | 过期键清理 |
根据压测数据,我们确定了分区数计算公式:
code复制分区数 = 峰值QPS / 单分区处理能力(约3000)
最终设置16个分区,每个分区配置:
properties复制num.io.threads=8
queued.max.requests=5000
某次大促出现Redis CPU 100%,发现是seckill:stock:123这个Key被百万次访问。解决方案:
seckill:stock:123_[0-9]Kafka曾积压50万消息,发现是消费者处理超时。优化方案:
java复制props.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, 100);
props.put(ConsumerConfig.FETCH_MAX_BYTES_CONFIG, 5242880);
大厂常问的深水区问题:
建议准备方向:
这个架构经过618、双十一考验,核心在于:异步化设计+多级缓存+柔性降级。实际开发中还需要配合全链路压测,我们当时用JMeter模拟了10万并发请求,持续优化了3个版本才达到SLA要求。