限流算法的理解,流行限流方案的初识

本文介绍了限流的基本原理和常见算法,包括固定窗口、滑动窗口、漏桶和令牌桶算法,并探讨了在代理层(如Nginx)、网关(如Spring Cloud Gateway)、消息中间件(如RabbitMQ)以及代码实现(如Resilience4j)中的限流应用。限流策略包括按原始请求数、remote地址、user、API等多种方式,以适应不同场景下的需求。
摘要由CSDN通过智能技术生成

        当请求量超过服务器的处理阈值时,服务器将阻塞或宕机。那么,此时我们应该采取合适的应对方案,来避免这样的问题,从而达到保护系统的目的,例如,从硬件上,更换性能更加强劲(更多的线程,更高的主频)的cpu(中央处理器);从代理层上,配置Nginx限流和负载均衡;从网关上,使用Spring Cloud Gateway限流、熔断以及调整线程数和连接数;从消息中间件上,利用RabbitMQ削峰限流;从缓存中间件上,使用Redis缓存热点数据;从Servlet容器上,调整Tomcat连接数和线程数;从虚拟机上看,进行JVM参数优化;从代码上,采取线程池,Druid或HikariCP数据库连接池,Resilience4j或Sentinel限流熔断,Ribbon或gRPC负载均衡等等。

        实际的生产环境更为复杂,为了达到高并发这个目的,我们需要针对不同环节的不同情况对方案进行合理合适地选择。而在这里主要是想探讨关于限流方面的知识,本文会先从限流的基本原理以及常用限流算法入手,然后讨论各个层面如何使用限流,最后实现一个我们自己的限流器来加深我们对限流的理解。

限流场景与算法

1.1 限流场景

        限流,就是对请求做出限制。而在现实生活中“限流”的场景是比比皆是,例如,在节假日出行,热门景点为了避免游客拥挤踩踏进行限流;在限量产品线下发售时,为了维持会场秩序,也会控制与会人员的数量;在疫情期间,为了避免车厢内人员拥挤以及控制人员间隔,每个车厢也只放出部分车票。同样的,在网络世界中,也存在各种各样的限流场景,例如,流量突增场景,用户流量突增,业务高峰时段;持续性大流量访问场景,网络爬虫,恶意访问或攻击。

        用户流量突增,主要是指目的合法、发生周期不规律、发生时间段短的流量突增场景。例如,当产品(网站或APP)首日上线或新版本上线时,用户为了体验新产品而在活动当时或当天进行登录体验操作,在此时,服务端将会接受大流量访问。

        业务高峰时段,主要是指目的合法、发生周期规律、发生时间段短的流量突增场景。例如,按年为周期的、按人和车次为单位的12306春运购票场景。

        网络爬虫,主要指通过使用自动抓取互联网信息的程序或者脚本,执行频率高,但不以破坏为目的的持续访问场景。例如,通过脚本访问旅游网站的产品报价,则具体会访问到某个网站的接口,当执行频率高时,将导致该网站接收到持续性的大流量访问。

        恶意访问或攻击,主要是指目的不合法的大流量访问。例如,DDoS 攻击,以及密码暴力破解。

1.2 限流策略

        限流,不仅是为了防备不正常流量,同时也是为了资源的公平利用。由于场景的不同、用户与服务器维护者目的的不同,情况就复杂多变,所以没有最优解策略,只有最合适的策略。而针对不同的情况,我以是否对请求做校验为标准,将限流策略分为原始限流和校验限流。原始限流,只考虑流量数限制,而不考虑请求方身份或被请求的资源;校验限流,考虑流量数,同时考虑请求方身份以及被请求的资源。

那么,接下来,将展开讨论各个请求策略的优缺点,以及一些已经开源产品的应用。

(1)按原始请求数限流策略

    只考虑流量数的限制,并不考虑请求方身份或被请求的资源。例如,某个系统定义其流量阈值为10 qps,那么,无论是哪个请求方都可以请求该系统接口,只有当系统请求量达到阈值时,才会拒绝访问。

    简单举个应用例子,将流量限制数max定义在配置文件中,并将当前请求量保存在缓存中间件(例如,redis),当请求进来时,拦截请求并从缓存中间件获取当前已请求量值,若未达到阈值,则该请求通过;若已达到阈值,则拒绝访问。

    当然你也可以拓展完善上面的例子,如在并发环境中,进行加锁操作保证数据一致性。优点,在于实现方法简单;缺点,无法满足复杂的业务环境下的复杂要求。

(2)按remote地址限流策略

        使用请求方的ip来标识请求,并限制该ip的访问频率。

        在代理层可以通过使用Nginx的limit_req_zone $binary_remote_addr 的配置来限流,即可通过ip来标识限制请求。优点,在于可以将限流精确到ip。

(3)按user限流策略

        使用请求方的user来标识请求,并限制该user的访问频率。

(4)按Api限流策略

        使用请求的api来标识请求,并限制访问该api的频率。

(5)按remote地址+user限流策略

        使用请求方的ip以及请求的用户标识请求。

(6)按remote地址+api限流策略

        使用请求方的ip以及请求的api标识请求。

(7)按user+api限流策略

        使用请求的用户以及请求的api标识请求。

(8)按remote地址+user+api限流策略

        使用请求方ip,请求的user以及请求的api标识请求。

<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一知先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值