秒杀
防止提前秒杀怎么实现? 令牌的值为什么设置库存的5倍 请求数据尽量要少、请求次数尽量要少、路径尽量要短、依赖尽量要少、不要有单点(第一节要RE哦)
动静分离: 提高单次请求的效率,减少没必要的请求量。 我们可以对数据进行动静分离,就比如HTML页面,新闻网站的页面对所有人都是一样的,就是静态页面;淘宝首页对不同的用户有不同的个性化商品,就是动态页面。那我们可以把动态变化的因素拆离出来,那对于静态的URI就可以进行缓存了。
静态数据或者请求URI对应的响应头响应体直接缓存到离用户近的CDN、浏览器、Web服务器(Nginx)上;CDN可以主动失效,但浏览器是不可控的,需要用户主动刷新才能得到数据。然而CDN的分布式部署范围很大,那对于缓存的致性问题、命中率、发布更新等都不好解决,所以我们可以让CDN作为二级缓存,CDN中没有则要去源站中拉取数据,所以我们就可以随意更新删除CDN中的缓存了。
热点数据: ①我们可以设置一个卖家报名的方式,把要参与秒杀的商品提前筛选出来;或者利用大数据分析(分析用户购物车、成交记录)提前得到热点商品,然后进行提前缓存。也可以根据上游服务来提前判断热点数据,比如搜索页面、商品详情访问量等判断出热点数据,然后提前促销预热。
处理热点数据时,可以使用LRU的缓存队列进行提前缓存、可以使用单独的数据库或者Cache集群存放热点数据。但这样成本太高,所以我们可以对商品ID进行一致性Hash,使得对于该热点商品的请求都会打到同一个分组中,避免因为秒杀而影响阻塞了所有的其他正常售卖。
对于热点请求,我们可以为秒杀设置单独的域名,然后路由到专门用于秒杀的服务器集群上,可以防止影响其他业务。请求还可以排队?(06|“减库存”)
削峰限流: 服务器的处理能力是恒定的,我们不能仅仅为了秒杀就给服务器很高的资源,会导致浪费。所以就需要秒杀时的削峰,使得服务器处理更加平稳。 排队:消息队列缓冲,向下游系统平缓地推送消息;
减库存:因为秒杀的订单量很大,所以我们可以采取下单减库存的方式(也可以预减库存,在规定时间内不付款再释放库存)。那么我们就要保证不能超卖。可以通过事务回滚、设置数据库字段为无符号整数等。
异步请求结果:可以在页面采用轮询的方式定时主动去服务端查询结果,减少连接数。