如何保证在流量突增的情况下,仍然保证系统的稳定性。
通过限流策略抵御秒杀期间的流量峰值。
当海量请求到来时,可以对请求进行层层限流、层层拦截,最终将海量请求削减成服务器能够处理的请求数。
尽早限流,上游拦截的越多,下游的请求越少
比如要设计一个秒杀购物电商网站的限流。
第一层限流:合法性限流
仅仅限制那些合法的用户请求能够抵达到秒杀服务器,将一些非法的请求全部拦截掉。
哪些是非法的呢?比如刷单用户,机器脚本
机器脚本 -> 限制手段是验证码
验证码也可以拉长用户的使用时间,降低流量的峰值。
比如下单的时间是毫秒级别,或者反复购买一件商品,可以断定下单的是机器人。
还有一种作法是隐藏入口
第二层限流,负载限流:
集群的一些工具,比如Nginx,LVS
建议使用单一一层的负载,如果每一级都负载,会增大网络请求,造成请求时间过长
前面两者是软件进行负载,也就是软负载。
还有硬件负载,比如
前两层限流都是将流量抵挡在抵达服务器之前
第三层限流,web服务器本身的限流:
比如设置Web服务器的最大链接数
还可以代码上设置一个令牌,抢到令牌的可以进行操作
还可以使用队列进行限流,这里的队列主要是消息队列
还可以使用缓存限流:
限流的本质是为了不断削减请求的数量,而缓存的作用是为了减少用户请求服务端的数量
为了有效的使用缓存进行限流,需要将系统设计为前后端分离或者叫动静分离的结构,
html缓存在客户端本地,大的文件比如图片、视频等可以OSS、CDN
动态缓存可以先缓存在本地的服务器之中,再缓存到由Redis组成的远程集群之中
但是缓存也不能设置多,要考虑多级缓存的数据一致性的问题,缓存的级别越多,一致性的问题就越严重。
不要盲目地进行技术的堆砌,对于大部分系统而言,我们使用静态缓存加上二级动态缓存就已经足够了。
总的来说,静态缓存可以将大量的静态资源缓存在服务器以外的地方,
而动态缓存可以很大程度上减少请求数据库的次数
监控限流:
CPU、内存、并发量等,都是衡量系统稳定性的指标
可以创建一些线程,来监控这些指标,当CPU使用率过高时,就可以临时性的采取服务降级或拒绝策略,比如把一些非核心的业务先临时关闭,从而为系统节约出一部分资源来。
之后可以恢复这些业务。
总结:
网友评论