如何设计一个支持大并发的商城秒杀系统

技术栈:  H5 ,  PHP , MySQL  , Redis ,RabbitMQ

在有大量购买下单行为的系统上,特别是商城系统或者直播秒杀系统,经常用到限时秒杀的功能。我们的开发工程师在最近一个客户的项目开发中,使用了10台服务器,一台Redis, 一个台RabbitMQ ,和一台MySQL 的架构。



 系统架构图

一.秒杀的流程是这样的 :

当硬件配置为:1台服务器 ,1台数据库

手机用户端看到要进行秒杀的商品 ,商品的状态目前是灰色的,处于还没有销售的状态,

平台设置好库存,当售卖的时间到, 秒杀的按钮变为可以点击 。

用户端点击下单按钮,此时如果有1万人同时点击下单按钮, 后台服务器收到前端的HTTP请求,

正常的情况下 ,有一个订单请求过来就直接插入数据库。但有1万人同时点击的时候, 同步插入数据库,服务器和数据库的性能都处理不了那么多的请求。

此时前端就会出现:

1.已经点击下单的用户卡住了,页面没有反应

2.还没有点击的用户点击不了购买按钮

进入后台就会出现:

1.服务器负载100%

2.数据库负载100%


这个是为什么?

1.因为数据库在大量线程进行数据插入和更新的时候,触发了行锁或者表锁,不断涌入的请求就被等待,数据库忙于锁的问题。CPU处于100%崩溃的边缘。如果是自建的MySQL可能数据都丢掉了。

2.数据库的变缓慢,服务器连接数据库的所有请求也都响应不了,服务器性能消耗光。


二.如何从硬件上优化秒杀系统


一台服务器能够达到的最大压力受到很多因素影响,比如服务器的参数配置,CPU性能,内存大小,磁盘性能,带宽大小,数据库性能,程序架构,程序语言等。

我们目前从程序架构上分析:

一台服务器和一台数据库在秒杀的时候承受不了那么多的订单,

我们就可以使用负载均衡的方案。

负载均衡:

负载均衡服务器做前置服务器,后端可以放我们我们的服务器。

负载均衡把请求分配到后端服务器。

把请求的压力平均分配给后端的多台服务器,减轻每台服务器的压力。

我们拿三台服务器做测试, 可以升级到8核16G。8核16G目前性价比比较合适。

当服务器负载过多的时候,可以增加更多的服务器节点。


三.如何从代码上优化秒杀系统

1.热点数据处理: 库存等热点数据, 每次购买都会Update库存的数据,在Redis做减操作。


2.请求放队列: 把所有的秒杀进来的请求放队列。


3.异步落库:  把队列中的请求,用脚本读取,进行异步落库。异步落库的频率速度要根据数据库的性能来,性能好的,落库频率可以快一些,如果性能差一点的数据库,那么就要控制落库的速度。


可以不断通过JMeter压力测试工具来验证 。


以上三点为重要的方法,在阻塞的场景灵活运用以上方法进行架构调优,10万+并发就不成问题。 


四.下单不支付,15分钟自动取消功能

当用户秒杀下单之后,到支付的环节,客户没有进行支付,系统要判断15分钟未支付的订单自动进行取消的功能。实现方式,订单创建时,把订单信息放到rabbitmq的延时队列,并设置TTL为15分钟,当客户15分钟没有对此订单进行支付,脚本把订单状态设置为取消订单,如果客户支付了,删除延时队列对应的订单消息。


五.中间件的选择


队列选择可以使用redis自带的队列 ,也可以选择专业的队列中间件RabbitMQ 。


六.小结
大的并发系统,需要用到服务器,数据库,队列中间件,缓存DB ,然后各个环节的优化要根据实际场景来。每次迭代优化都需要进行相关的压力测试,确保每个环节能协调达到最优状态。

七.商业合作

 如果你的公司计划做访问量很大,下单并发量很大的系统, 可以和网润软件联系。 


网润开发团队

2025年7月