

还记得每年双11凌晨,无数人守在手机前疯狂点击"立即购买"的场景吗?几百万人同时抢购几千件商品,这对系统来说简直是一场"生死考验"。
秒杀场景有多恐怖?让我们看看数据:
如果架构设计不当,轻则页面卡顿,重则服务器直接"躺平"。那么京东、淘宝这些电商巨头是怎么做到秒杀不挂的呢?
在深入技术细节之前,我们先要明白秒杀架构的几个核心理念:
就像防洪大坝一样,我们需要把瞬间的流量洪峰分散开来,避免系统被冲垮。
用户点击后立即返回结果,实际处理在后台慢慢进行。
宁可拒绝部分请求,也要保证核心服务正常运行。
热点数据全部放缓存,数据库只处理最终的订单写入。
让我们看看一个完整的秒杀系统架构长什么样:

这个架构就像一个精密的防御体系,每一层都有其独特的作用:
1. CDN层:静态资源(图片、JS、CSS)直接从CDN返回,根本不经过我们的服务器。这就像在家门口设置了一个"免战牌",把大部分请求挡在门外。
2. 负载均衡层:使用Nginx或LVS做流量分发,确保请求均匀分布到多台服务器上。想象一下,这就像银行的多个窗口,避免所有人挤在一个窗口排队。
3. 网关层:这是我们的"保安队长",负责限流、鉴权、防刷等工作。每秒只允许固定数量的请求通过,超过的直接返回"系统繁忙"。
4. 应用层:真正的业务逻辑处理,采用集群部署,任何一台挂了都不影响整体服务。
5. 缓存层:Redis存储库存信息,本地缓存存储商品详情。99%的读请求都在缓存层解决,数据库压力大大减轻。
6. 消息队列:订单处理采用异步方式,用户下单后立即返回,实际扣库存、创建订单等操作通过消息队列慢慢处理。
7. 数据库层:采用主从架构,读写分离。秒杀期间,查询走从库,只有最终的订单写入才访问主库。
接下来看看用户点击"秒杀"按钮后,系统是如何处理的:

第一道防线 - 前端拦截
第二道防线 - 网关校验
第三道防线 - 库存扣减
-- Redis Lua脚本,保证原子性
local stock = redis.call('get', KEYS[1])
if tonumber(stock) > 0 then
redis.call('decr', KEYS[1])
return 1
else
return 0
end这段Lua脚本在Redis中原子执行,避免超卖。就像银行取钱,必须先检查余额再扣款,而且这两个操作必须是原子的。
第四道防线 - 异步处理

缓存预热就像餐厅开门前的准备工作,把今天要卖的菜都准备好,客人来了直接上菜,不用现做。
具体做法:
最常用的限流算法有三种:
令牌桶算法(推荐)
public class TokenBucket {
private long capacity; // 桶容量
private long tokens; // 当前令牌数
private long lastRefill; // 上次填充时间
private long refillRate; // 填充速率
public synchronized boolean tryAcquire() {
refill();
if (tokens > 0) {
tokens--;
return true;
}
return false;
}
private void refill() {
long now = System.currentTimeMillis();
long tokensToAdd = (now - lastRefill) * refillRate / 1000;
tokens = Math.min(capacity, tokens + tokensToAdd);
lastRefill = now;
}
}令牌桶就像地铁闸机,每秒放行固定数量的人,既能应对突发流量(桶里有存量令牌),又能控制平均流量。
在扣减库存时,我们需要分布式锁来保证数据一致性:
// 使用Redisson实现分布式锁
RLock lock = redisson.getLock("product:" + productId);
try {
if (lock.tryLock(100, TimeUnit.MILLISECONDS)) {
// 检查并扣减库存
Long stock = redis.decr("stock:" + productId);
if (stock < 0) {
redis.incr("stock:" + productId);
return "库存不足";
}
// 发送消息到队列
sendToQueue(userId, productId);
return "秒杀成功";
}
} finally {
lock.unlock();
}问题:某个爆款商品被疯抢,单个Redis节点扛不住。
解决方案:
核心原则:宁可少卖,不可超卖。
具体措施:
当系统压力过大时,我们需要有Plan B:

降级就像开车遇到暴雨,虽然慢了点,但至少能安全到达目的地。
设计一个高并发的秒杀系统,本质上是在玩一场"攻防游戏"。我们要像建造城堡一样,一层层地设置防线:
记住,没有完美的架构,只有最适合的架构。京东、淘宝的方案也是经过无数次大促洗礼才逐步完善的。
最后送大家一句话:架构设计如行军打仗,知己知彼,百战不殆。了解业务特点,预判系统瓶颈,提前做好准备,你的秒杀系统也能稳如泰山!
💡 小贴士:本文介绍的是通用秒杀架构思路,实际应用时需要根据自己的业务规模和特点进行调整。千万不要过度设计,适合的才是最好的!