浏览页面如何将请求拦截在上游
在以往的秒杀系统架构经历中,曾出现过这么一种状况:当时把系统的方方面面都考虑到了,但是活动一上线,第三方监控系统就显示异常,检查后发现所有服务器的性能指标都没问题,唯独出口带宽有问题,它被占满了。结果就是用户参与活动时页面出现严重卡顿,用户抱怨不断。
因此,静态资源尽量使用CDN(内容分发网络),如果涉及PC网站,还必须首先进行前后端分离。使用CDN的好处是不用花费自己的服务器资源和带宽,且响应速度快。通过这种方式,可以把静态资源的压力拦截在系统分层的外面。
如果是动态的请求该怎么办?有以下3种实现方式:
评论、商品详情、购买数量等相关的请求,一般都是通过 JS(JavaScript)在后台动态调用。在这个场景中,可以把动态的数据与页面进行整合,比如把每个秒杀商品的详情页面变成静态页面,然后再放入CDN。如果觉得改造太大,也可以把它放在Redis缓存中。
判断服务器时间并设置开启秒杀的标识。一般页面中都有JS,它通过访问服务器获取服务器时间,然后根据时间开启秒杀下单的按钮,即判断秒杀开始时,会将下单按钮设置为可用。针对获取服务器时间的这个请求,把它放在静态资源或负载均衡那层即可,这样用户请求就不会进入系统下游。
判断秒杀结束。具体做法是将秒杀结束的标识放在Cookie中,如果Cookie中没有结束标识,请求就会进入后台服务器,后台服务器判断本地内存没有结束标识,就会进入缓存,如果缓存中也没有结束标识,那就说明秒杀没有结束。
总体来说,对于浏览页面的用户行为,需要把用户请求尽量拦截在CDN、静态资源或负载均衡侧,如果确实做不到,也要拦截在缓存中。