百万并发秒杀概述1.1你可能会遇到的问题当服务瞬间有大量请求时,服务可能会崩溃。当产品在几秒钟内售出时,它可能会超卖。1.2秒杀的业务流程秒杀的产品包括热门产品和非热门产品,其中热门产品的流量可能占到整体流量的90%。后台商品管理可以将商品添加到秒杀商品中,根据商品访问量将热门商品和非热门商品分类。用户抓取商品付款,商品发货。如果未在期限内付款,订单将被取消。二秒杀架构秒杀系统架构图我们的Java项目是用tomcat部署的。nginx的并发可以达到5万,tomcat最多可以支持1000。所以第一个问题就是让tomcat直接处理请求,减少tomcat处理请求。因为商品的详情页除了数量基本没有变化。因此,可以使用详情页将其放入nginx缓存中。另外考虑到爆款的抢购不能直接通过nginx由服务器处理,完美解决了问题。lua脚本检查JWT:用户请求到达nginx,通过lua脚本进行jwt检查,减少非法请求访问服务器。从而减轻服务器压力。2.1静态页面处理由于秒杀产品浏览量高,产品描述、价格、图片、标题基本不变。因此,可以考虑使用freemarker使产品静态化。所以首先考虑静态页面的生成,如果产品数量发生变化,会重新生成静态页面。1、后台会设置产品成为秒杀产品流程:比如京东的秒杀是从一个时间点到另一个时间点。秒杀时间到了,需要删除对应的索引,将对应的静态页面从索引库中删除。我们可以在给商品添加闪购的时候设置一个定时任务。然后在定时任务到达后执行相应的操作。添加秒杀的时候,把数据库中的item改成in秒杀,然后生成静态页面。2.商品数量修改,静态页面同步(canal数据同步):在使用canal监控数据库表时,在表中增删改查数据时,canal可以监控。从而触发canal写的Java服务,然后根据业务修改静态页面。3.静态页面的生成和删除:当商品变成闪购商品时,会生成静态页面。当产品售罄或成为普通产品时,删除静态页面。2.3隔离秒杀的热点数据我们可以根据商品的浏览量来判断当前商品是否为热点数据。因此,有必要收集产品浏览记录,并对收集到的浏览记录进行分析。2.3.1日志采集当用户访问商品详情时,首先请求通过nginx,然后通过nginx和lua脚本拦截请求的商品详情路径,然后将请求的商品数据发送给kafka。数据库接收kafka数据,完成商品浏览数据的采集。2.3.2数据分析ApacheDruid订阅Kafka获取产品访问日志,Druid可以实时获取产品访问记录。Druid支持SQL来分析数据。查找热点数据。#lua脚本发送到kafka日志格式{"actime":"2020-4-109:50:30","uri":"http://192.168.211.137/items/S1235433012716498944.html","ip":"119.123.33.231","token":"BearerITHEIMAOOPJAVAITCAST"}2.3.3热点数据隔离可以使用定时任务(elastic-job)实时查询Druid,将最近访问的商品放入redis缓存。缓存中的数据如下:商品库存、价格、名称等。备注:当用户下单时,是redis中的热销商品,将订单下单到热点。不在redis不是热销商品,直接通过服务下单即可。在往redis中放入热item时,需要根据item的lock字段对item进行加锁。然后把商品信息放到redis中。用户抢购商品,热销商品同时放在redis中,造成库存混乱。2.4热门非热门商品的抢购流程需要判断当前用户是否在24小时内抢购了当前商品。判断抢购品是冷品还是热品。判断库存是否充足。1、非热销商品秒杀:确定为非热点数据,进入服务下单系统。b判断库存,如果库存充足,请下单。如果库存不足,则回滚事务。c如果库存充足,但该商品成为热销商品。下单操作应该发送到kafka,然后成为热门商品的下单操作(防止商品库存混乱)。d记录用户抢劫的商品,用于提醒用户该商??品24小时不可抢劫。2、爆款秒杀:Lua脚本进行JWT校验,判断用户是否登录。b从redis查询用户是否抢到商品(抢购成功后,商品和用户信息会存入redis)。c从redis热销商品查询,该商品是否为热销商品。如果是爆款,库存>0,抢购爆款的过程。d判断用户的商品是否在队列中(利用redis的incr自增判断当前用户的商品是否重复排队)。是的,提示用户正在排队。不行,只能排队。e点餐系统通过队列订阅读取用户的订单信息并下单。3流量监控在秒杀项目中,需要集成Sentinel进行限流操作。当一个冷门产品在秒杀过程中成为热门产品时,接入服务流量瞬间激增,需要使用Sentinel限流来保护服务的稳定性。
