如何设计一个秒杀系统

说到秒杀系统,我们第一反应有可能是电商平台花样繁多的抽奖活动、12306的抢票系统等,的确这些都涉及到了秒杀概念。

秒杀系统具备哪些特点?

1、瞬时高并发,短时间内的流量洪峰,用户量的激增促使网站流量突破上限;

2、出现超卖现象,成功下单的人数比库存量还要多;

3、业务流程简单,没有过多花俏功能。

秒杀系统该如何设计?

基于上面提到的特点,秒杀系统需要做到以下几点:

1、前台静态资源走CDN加速

将JS、CSS、图片、音视频等文件放在CDN上采用预热形式将资源刷新到各CDN节点上,使得用户“就近读取”,加快访问速度,另外也减小源站服务器的压力。

2、限流

对用户请求做限制,同一时间段内同账号禁止发送大量请求。

3、任务异步化处理

比如下单、邮件通知、短信接收等,业务能作异步处理的一定要异步处理,避免同步阻塞。

4、合理的缓存

秒杀的商品数据多数都不需要实时更新(除库存等字段外),对于这类不需要实时更新的热点数据放在缓存里,避免从数据库中查询,可降低数据库的负载压力。

5、其它业务降级

任何一个平台的软硬件资源是有限的,所以我们可以将一些不重要的业务暂停服务,将资源让出来给秒杀系统使用。

下面我们来详细探讨一下接口层如何处理。

如何设计一个秒杀系统

上图主要描述了后端接口在处理请求所做的操作:

1、操作缓存数据,缓存可以存放商品当前总量,如果Redis是分布式部署,可以采用分布式锁来解决脏数据问题。

2、将不需要及时响应的业务放入消息队列。

3、定时将缓存数据更新到数据库,为了避免脏数据产生可以采用悲观锁和乐观锁两种方式,个人比较推荐乐观锁方式。

4、消费消息队列消息,针对消息类别做不同的操作。


秒杀系统存在较多不确定性(如:请求数、并发数),所以秒杀系统也离不开监测系统对各项指标的监测,在发现异常时要做熔断处理,另外在资源不够时提交做好扩容准备。