什么是秒杀 秒杀场景通常会在电商网站举行一些活动或者节假日在12306网站上抢票时遇到。对于网站中一些稀缺或者特价的产品,电商网站通常会在约定的时间对其进行限量销售,由于这些产品的特殊性,会吸引大量用户前来抢购,而且会在约定时间同时在秒杀页面进行抢购。前端
设计思路 将请求拦截在系统上游,下降下流压力;秒杀系统特色就是并发量极大,但实际秒杀成功的请求数量确不多,因此若是不在前端拦截可能形成数据库读写锁冲突,甚至致使死锁,最终请求超时,甚至致使系统崩溃 充分利用缓存:利用缓存能够极大提升系统读写速度 消息队列:消息队列能够削峰,将拦截大量并发的请求,这也是一个异步处理过程,后台业务根据本身的处理能力,从消息队列中主动的拉取请求消息进行业务处理数据库
前端方案 浏览器端(js): 页面静态化:将活动页面上的全部能够静态的元素所有静态化,并尽可能减小动态元素,经过CDN来抗峰值 禁止重复提交:用户提交以后按钮置灰,禁止重复提交 用户限流:在某一时间内只容许用户提交一次请求,好比能够采起IP限流后端
后端方案 服务器控制器层(网关层) 限制UID(userID)访问频率:咱们上面拦截了浏览器的访问请求,但准对某些恶意请求和攻击或者其余插件,在服务器控制层要准对同一个uid,限制访问频率浏览器
服务层 上面只拦截了一部分请求,当秒杀的用户量很是大时,即便每一个用户只有一个请求,到服务层的请求数量仍是很大。好比咱们有100w用户同时抢购100台手机,服务层并发请求压力至少为100w。 1.采用消息队列缓存请求:既然服务器层知道库存只有100台手机,那彻底没有必要把100w个请求都传递到数据库里,那么能够先把这些请求都写到消息队列里面缓存一下,数据库层订阅消息减小库存,减库存成功的请求返回秒杀成功,失败的返回秒杀结束 2.利用缓存应对读请求:对相似12306等购票业务,是典型的读多写少业务,大部分请求时查询请求,因此能够利用缓存分担数据库压力 3.利用缓存对写请求:缓存也是能够应对写请求,好比咱们能够把数据库中库存数据迁移到Redis缓存中,全部减库存操做都在Redis中进行,而后经过后台进程把Redis中的用户秒杀请求同步到数据库中缓存
数据库层 数据库层是最脆弱的一层,通常在应用设计时在上游就须要把请求拦截,数据库层只承担“能力范围内”的访问请求。因此,上面经过在服务层引入的队列和缓存,让底层的数据库高枕无忧服务器