【性能调优】限流策略

如何保证在流量突增的情况下,仍然保证系统的稳定性,或者说如何避免由于并发访问量远远超过系统能够正常承载的并发量而导致的雪崩

第一层限流:合法性限流

仅仅限制合法的用户请求能够抵达服务器,而将一些非法的请求全部进行拦截
什么是合法性限流?
实际请求的用户可能是人,也可能是机器人,并且还可能存在同一用户反复操作的行为

  1. 验证码

验证码还有一个作用,可以拉长用户的访问时间,比如1秒中有100w用户同时进行抢购行为,若使用了验证码,用户从输入验证码到到整个下单的整个过程就可能需要3秒钟,这样整个系统需要支撑的吞吐量变成原来的1/3

  1. IP限制
    通过网络技术监测到某个IP下的下单频率在毫秒级别,或者反复购买同一件商品,可以断定下单的是机器人或者不合法的用户,将这个IP加入到黑名单中,从而减少不合法的流量

  2. 隐藏秒杀服务地址
    在开始秒杀之前,隐藏秒杀的服务地址或者秒杀入口

第二层限流:负载限流

集群(nginx和LVS)
在这里插入图片描述

网络七层协议
在这里插入图片描述
级联负载,但是每增加一次负载就会增加一个转发路径,可能带来网络延迟问题,因此太多的级联负载是不推荐的。
常见的做法是单独使用nginx或使用nginx和LVS

LVS处于第4层,它是通过网络端口进行负载
nginx是第7层,它是应用级别的负载

软负载和硬负载
以上的负载为软负载,硬负载为使用硬件工具进行负载,常见的硬负载工具有F5或Array等

第三层限流:服务限流

一、通过web服务器本身进行限流
比如Tomcat,把Tomcat最大连接数设置成一个合理的值,比如单Tomcat最大连接数<=300,那如果超过300的连接请求,就会被Tomcat无条件拒绝,这样就可以保证Tomcat的稳定性了

二、在服务器的内部编写算法限流
常见算法有令牌桶算法、漏桶算法。或者直接调入一些类库里边已经存在的API

Google Gyava类库的令牌桶算法
在这里插入图片描述
其中,create方法限制最多有100个线程可以同时进行,tryAcquire方法可以设置每秒的线程执行可以持续的时长

三、消息队列限流
不使用消息队列时,所有请求平均分给所有的子系统,但是不同的子系统可以处理的极限不一样,这样导致短板的子系统出现延迟或者崩溃的情况
在这里插入图片描述
消息队列本质是一种缓冲区,消息队列可以将所有的请求临时存储,然后所有的子系统再分别根据自己的性能,分别去消息队列中针对性地去拉取特定数量的请求

四、缓存限流
限流的本质是为了不断的削减请求的数量,而缓存的作用是为了减少用户请求服务端的数量
背景:服务前后端分离或动静分离结构(动态请求资源、nginx、静态请求资源)

1. 静态请求缓存
当客户端第1次请求服务端的时候,服务端将网页的基本结构代码显示给客户端
比如我们第1次访问某个网站时,网站服务器就会将搭建此网站的HTML和JavaScript脚本等代码响应给客户端,那么客户端就可以将这些HTML和JavaScript代码缓存到客户端浏览器之中,当用户以后再次访问这个网站时,就可以直接从本地浏览器的缓存中获取HTML和JavaScript代码了
对于如HTML和JavaScript体积比较小的代码,可以直接缓存到浏览器之中,但是如果体积比较大的图片,最好将它们缓存到nginx,或通过nginx转发在OSS等云服务器之中,而如果是视频等一些体积特别大的静态资源,也可以将它缓存在CDN中,利用CDN区域部署就近访问的特点,来提高用户的访问速度

2. 动态缓存
动态缓存一般先建议缓存在本地的服务器之中,如果本地服务器的缓存失效,再缓存到由redis组成的远程集群之中进行二次的查询

在这里插入图片描述

缓存不是越多级别越好,缓存需要考虑多级缓存带来的一致性问题,解决这些一致性问题,会增加系统的开发成本以及系统的额外开销,缓存级别越多,请求在系统内部的跳转路径也会越长

3. 监控限流
CPU、内存、并发量等都是衡量系统稳定性的重要指标
创建一些线程,专门用于监控CPU、内存这些指标,比如如果CPU的利用率达到了极限,就可以临时性的采取服务降级或者拒绝策略
服务降级指的是,当系统资源不足时,就可以把查看三个月以前的历史订单,历史评论等一些非核心的服务临时关闭,从而为系统节约出一部分的资源。
在采用服务降级或拒绝策略一段时间之后,CPU等资源利用率就会恢复到正常状态,之后就可以重新接收并处理新的请求

在这里插入图片描述

原文地址:https://www.cnblogs.com/guanhuohuo/p/12533564.html