秒杀系统之因此难作,是由于在极短的时间内涌入大量的请求,来同时访问有限的服务资源,从而形成系统负载压力大,甚至致使系统服务瘫痪以及宕机的可能。本文会介绍秒杀系统中存在的痛点以及针对这些点的优化思路。web
如:12306的春节抢票、各大电商搞的定时抢购活动,如小米手机的在线抢购等,抢过火车票的同窗都知道在放票的那一瞬间可能1s都不到,票就被抢购一空了。数据库
(1)短期内高并发,系统负载压力大后端
(2)竞争的资源有限,数据库锁冲突严重缓存
(3)避免对其余业务的影响安全
(1)客户端层:手机或PC端操做的客户端页面,域名经过DNS解析路由到NGsession
(2)反向代理层:通常经过NG做为反向代理,将客户端请求均衡路由到后端站点服务,NG也能够水平扩展为多实例,且每一个实例可单独部署为主从的高可用方案。架构
(3)站点层:站点层能够水平扩展为多个实例部署,以此来均衡来自客户端请求产生的高并发负载,多个web server之间的session信息能够集中存储于分布式缓存服务(Redis,MemCache)中。并发
(4)服务层:服务层也可水平扩展为多个实例部署,即时下最火的微服务方式异步
(5)数据库层:数据库层的常见部署方式,如读写分离,分库分表等分布式
(1)尽可能将请求拦截在上游
对于秒杀系统来讲,系统的瓶颈通常在数据库层,因为资源是有限的,如库中共1万张票,一瞬间并发进来100万的请求,那么有99万都是无用的请求,因此为了更好的保护底层有限的数据库资源,尽可能将请求拦截在上游。
(2)充分利用缓存
缓存不但极大的缩短了数据的访问效率,更重要的是承载了底层数据库的访问压力,因此对于读多写少的业务场景充分利用好缓存
(3)热点隔离
业务隔离:如12306的分时段售票,将热点数据分散处理,来下降系统负载压力
系统隔离:实现系统的软硬隔离,不光是实现软件的隔离,还能够实现硬件的隔离,尽最大限度的减小秒杀带来的高并发安全性问题。
数据隔离:启用单独的cache集群或数据库来存放热点数据
(1)页面端优化,如:
(2)web server层优化,如:
(3)后端service服务层优化
注:库存信息放入Redis缓存的时候最好分为多份放入不一样key的缓存中,如库存为10万能够分为10份分别放入不一样key的缓存中,这样将数据分散操做能够达到更高的读写性能。
(4)DB层优化