令牌桶算法

高并发之API接口,分布式,防刷限流,如何做?

﹥>﹥吖頭↗ 提交于 2020-04-06 03:48:24
https://mp.weixin.qq.com/s/70negHg4kNP32l3CrnNRoA 高并发之API接口,分布式,防刷限流,如何做? 后端技术精选 今天 在开发分布式高并发系统时有三把利器用来保护系统:缓存、降级 、 限流 缓存 缓存的目的是提升系统访问速度和增大系统处理容量 降级 降级是当服务出现问题或者影响到核心流程时,需要暂时屏蔽掉,待高峰或者问题解决后再打开 限流 限流的目的是通过对并发访问/请求进行限速,或者对一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务、排队或等待、降级等处理 问题描述 1、 某天A君突然发现自己的接口请求量突然涨到之前的10倍,没多久该接口几乎不可使用,并引发连锁反应导致整个系统崩溃。如何应对这种情况呢?生活给了我们答案:比如老式电闸都安装了保险丝,一旦有人使用超大功率的设备,保险丝就会烧断以保护各个电器不被强电流给烧坏。同理我们的接口也需要安装上“保险丝”,以防止非预期的请求对系统压力过大而引起的系统瘫痪,当流量过大时,可以采取拒绝或者引流等机制 。 2、 缓存的目的是提升系统访问速度和增大系统能处理的容量,可谓是抗高并发流量的银弹;而降级是当服务出问题或者影响到核心流程的性能则需要暂时屏蔽掉,待高峰或者问题解决后再打开;而有些场景并不能用缓存和降级来解决,比如稀缺资源(秒杀、抢购)、写服务(如评论、下单)

高并发服务限流实践(一)

社会主义新天地 提交于 2020-03-28 22:13:39
本文从限流背景开始,介绍了限流的常用方法、代码实现和限流组件源码分析。本文是该系列的第一篇,介绍限流背景,限流算法和RateLimiter限流实现。第二篇会介绍RateLimiter的源码实现。 一、限流背景 限流是保护系统的重要利器,通过对并发访问或请求数进行限制或者对一个时间窗口内的请求数进行限速,用于防止大流量或突发流量导致服务崩溃。一旦达到限制速率则可以拒绝服务或进行流量整形。 在实践中会在网络层,接入层(Nginx),应用层进行限流。本文介绍的是应用层的限流方式,对于其它层原理类似,分层或使用的技术手段不同而已。 一般的大流量场景如秒杀,抢购系统,大并发电商系统等,实现技术可以限制线程池,数据库连接池,瞬间并发数,接口调用速率、限制MQ消费速率。根据网络连接数、网络流量、CPU或内存负载等来限流等。 二、限流算法 限流常用的基本算法有两种,漏桶算法和令牌桶算法。 如上图就像一个漏斗一样,进来的水量就像访问流量一样,出去的水量像系统处理请求一样。当访问流量过大时,漏斗中就会积水,如果水太多了就会溢出。 2.1 漏桶算法 漏桶算法一般有队列(Queue)和处理器两个组件构成,队列用于存放请求,处理器复杂处理请求。 (1)请求达到如果未满,则放入队列,之后有处理器按照固定速率取出请求进行处理。 (2)如果请求量过大超出了最大限制,则新来的请求会被抛弃。 漏桶算法示意图 2.2

几种限流算法

99封情书 提交于 2020-03-12 02:13:28
漏桶算法 思路很简单,请求先进入到漏桶里,漏桶以固定的速度出水,也就是处理请求,当水加的过快,则会直接溢出,也就是拒绝请求,可以看出漏桶算法能强行限制数据的传输速率。 该算法很好的解决了时间边界处理不够平滑的问题,因为在每次请求进桶前都将执行“漏水”的操作,再无边界问题。 但是对于很多场景来说,除了要求能够限制数据的平均传输速率外,还要求允许某种程度的突发传输。这时候漏桶算法可能就不合适了,令牌桶算法更为适合。 令牌桶算法 令牌桶算法的原理是系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务。 来源: CSDN 作者: 茴香豆的茴有六种写法 链接: https://blog.csdn.net/reed1991/article/details/104805942

何时进行服务熔断、服务降级、服务限流?

回眸只為那壹抹淺笑 提交于 2020-03-07 02:13:42
伴随着微服务架构被宣传得如火如荼,一些概念也被推到了我们面前(管你接受不接受),其实大多数概念以前就有,但很少被提的这么频繁(现在好像不提及都不好意思交流了)。想起有人总结的一句话,微服务架构的特点就是:“一解释就懂,一问就不知,一讨论就吵架”。 服务熔断 在介绍熔断机制之前,我们需要了解微服务的雪崩效应。在微服务架构中,微服务是完成一个单一的业务功能,这样做的好处是可以做到解耦,每个微服务可以独立演进。但是,一个应用可能会有多个微服务组成,微服务之间的数据交互通过远程过程调用完成。这就带来一个问题,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其它的微服务,这就是所谓的“扇出”。如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起系统崩溃,所谓的“雪崩效应”。 熔断机制是应对雪崩效应的一种微服务链路保护机制。我们在各种场景下都会接触到熔断这两个字。高压电路中,如果某个地方的电压过高,熔断器就会熔断,对电路进行保护。股票交易中,如果股票指数过高,也会采用熔断机制,暂停股票的交易。同样,在微服务架构中,熔断机制也是起着类似的作用。当扇出链路的某个微服务不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回错误的响应信息。当检测到该节点微服务调用响应正常后,恢复调用链路。 在Spring

微服务网关常用限流算法

限于喜欢 提交于 2020-02-12 00:51:10
常用算法有三种:计数器算法、漏斗桶算法、令牌桶算法,市面上最常用的是最后一个 第一个:计数器算法 他维护的是单位时间内的最大请求量,因此极端情况可能造成服务抖动 第二个:漏斗桶算法,这种算法保护了后端的微服务,但是会可能造成微服务网关压力激增 第三种:令牌桶算法 令牌桶算法相对于漏斗桶算法,其实就是少了一个输出速率的设置,他与漏斗桶算法相比,主要是为了保护网关自己,由于网关在实际的应用场景中会显得非常关键,因此大部分的限流算法都会选择令牌桶算法 来源: https://www.cnblogs.com/hopeiscoming/p/12297528.html

高并发系统中的限流算法

拈花ヽ惹草 提交于 2020-02-11 15:52:49
在高并发系统时有三把利器用来保护系统: 缓存、降级和限流 ,本文将介绍一些限流的相关概念、算法和常规的实现方式。 缓存 缓存比较好理解,在大型高并发系统中,如果没有缓存数据库将分分钟被爆,系统也会瞬间瘫痪,使用缓存不单单能够提升系统访问速度,提高并发访问量,也是保护数据库、保护系统的有效方式,大型网站一般主要是“读”,缓存的使用很容易被想到。 在大型“写”系统中,缓存也常常扮演非常重要的角色,比如累积一些数据批量写入,内存里面的缓存队列(生产消费),以及HBase写数据的机制等等也都是通过缓存提升系统的吞吐量或者实现系统的保护措施,甚至消息中间件,你也可以认为是一种分布式的数据缓存。 降级 服务降级是当服务器压力剧增的情况下,根据当前业务情况及流量对一些服务和页面有策略的降级,以此释放部分服务器资源以保证核心任务的正常运行。降级往往会指定不同的级别,面临不同的异常等级执行不同的处理。根据服务方式,可以拒绝服务,可以延迟服务,有时候也可以随机服务。 根据服务范围,可以砍掉某个功能,也可以砍掉某些模块。总之服务降级需要根据不同的业务需求采用不同的降级策略,主要目的就是服务虽然有损但是总比没有好。 限流 常见的限流算法有:计数器、漏桶和令牌桶算法。 1.计数器 计数器是最简单粗暴的算法,比如某个服务最多只能每秒钟处理100个请求,我们可以设置一个1秒钟的滑动窗口,窗口中有10个格子

SpringCloud-gateway原理

风格不统一 提交于 2020-01-28 03:06:56
1.什么是gateway(网关) Spring Cloud Gateway是Spring Cloud官方推出的第二代网关框架,取代Zuul网关。网关作为流量的,在微服务系统中有着非常作用,网关常见的功能有路由转发、权限校验、限流控制等作用。本文首先用官方的案例带领大家来体验下Spring Cloud的一些简单的功能,在后续会使用详细的案例和源码解析来详细讲解Spring Cloud Gateway. 2.网关的作用如下: 协议转换,路由转发 流量聚合,对流量进行监控,日志输出 作为整个系统的前端工程,对流量进行控制,有限流的作用 作为系统的前端边界,外部流量只能通过网关才能访问系统 可以在网关层做权限的判断 可以在网关层做缓存 Spring Cloud Gateway作为Spring Cloud框架的第二代网关,在功能上要比Zuul更加的强大,性能也更好。随着Spring Cloud的版本迭代,Spring Cloud官方有打算弃用Zuul的意思。在笔者调用了Spring Cloud Gateway的使用和功能上,Spring Cloud Gateway替换掉Zuul的成本上是非常低的,几乎可以无缝切换。Spring Cloud Gateway几乎包含了zuul的所有功能。 注:该图片来自官网 如上图所示,客户端向Spring Cloud Gateway发出请求。

RateLimiter:限流N个请求,但允许通过了N+个请求

懵懂的女人 提交于 2020-01-26 12:05:23
问题描述 接口:getUrlDic我设置了限流5个,但是在第一秒的请求了,实际允许通过了9个(或10个),之后正常 RateLimiter使用方式参考:https://blog.csdn.net/fly910905/article/details/103644950 标题 问题分析 RateLimiter内部有个实现:SmoothBursty SmoothBursty SmoothBursty限流器使用令牌桶算法实现,这个限流器在空闲时候能够存储一定的令牌(默认是1秒钟时间产生的令牌),可以应对空闲一段时间后突然的爆发量请求。 guava的RateLimiter有一个核心的设计思想:当前请求的债务(请求的令牌大于限流器存储的令牌数)由下一个请求来偿还(上个请求亏欠的令牌,下个请求需要等待亏欠令牌生产出来以后才能被授权)。 具体参考:https://blog.csdn.net/fly910905/article/details/103644950 因此,如果第一秒的请求时空闲很久后的有一次请求,这时RateLimiter中已经存储了N个限流请求(默认是存储了1s的限流数),这事总的可允许请求数就是:N< 空闲后第一次可允许请求数 < 2N 来源: CSDN 作者: goodpinna 链接: https://blog.csdn.net/goodpinna/article

高并发的场景下,不能不说的限流算法

旧巷老猫 提交于 2020-01-17 23:38:51
先举个例子,说明为什么要做“限流”。 旅游景点通常都会有最大的接待量,不可能无限制的放游客进入,比如故宫每天只卖八万张票,超过八万的游客,无法买票进入,因为如果超过八万人,景点的工作人员可能就忙不过来,过于拥挤的景点也会影响游客的体验和心情,并且还会有安全隐患; 只卖 N 张票,这就是一种限流的手段。 软件架构中的限流 软件架构中的限流也是类似,也是当系统资源不够的时候,已经不足以应对大量的请求,为了保证服务还能够正常运行,那么按照规则,系统会把多余的请求直接拒绝掉,以达到限流的效果; 对外限流:用户过多,或因为某个活动或热点问题引发的访问量的增加;恶意攻击,或被爬虫抓取数据等等。不知道大家注意过没有,比如双11,刚过12点有些顾客的网页或APP会显示下单失败的提示,有些就是被限流掉了。 对内限流:大部分公司,系统和系统之间都会相互调用,假如 A 系统 被 X、Y、Z 三个系统调用,当 X 系统的访问量徒增,导致 A 系统被调的挂掉了,那么会导致 Y、Z 系统也无法正常使用(依赖于 A 系统)。 计数器法 计数器法的原理就是限制单位时间内的处理请求数不超过阈值。 比如一个接口一分钟可以处理 1000 次请求,那么可以设置一个计数器,当有一次请求过来,计数器就加 1,如果一分钟以内计数器超过了 1000,那么后面再过来的请求就不再处理; 但是这个方法的缺点也很明显

服务高可用:流控和熔断机制

空扰寡人 提交于 2020-01-13 00:49:11
流量控制 漏桶算法: 主要目的是控制数据注入到网络的速率,平滑网络上的突发流量。它模拟的是一个漏水的桶,所有外部的水都先放进这个水桶,而这个桶以匀速往外均匀漏水,如果水桶满了,外部的水就不能再往桶里倒了。 这里你可以把这些外部的水想象成原始的请求,桶里漏出的水就是被算法平滑过后的请求。从这里也可以看出来,漏桶算法可以比较好地控制流量的访问速度。 令牌桶算法 控制的是一个时间窗口内通过的数据量。大概实现如下: 1.每1/r秒往桶里放入一个令牌,r是用户配置的平均发送速率(也就是每秒会有r个令牌放入) 2.桶里最多可以放入b个令牌,如果桶满了,新放入的令牌会被丢弃 3.如果来了n个请求,会从桶里消耗n个令牌。 4、如果桶里可用令牌数小于n,那么这n个请求会被丢弃或者等待新的令牌放入。 算法按一定速度均匀往桶里放入令牌,原始请求进入后,根据请求量从令牌桶里取出需要的令牌数,如果令牌数不够,会直接抛弃掉超限的请求或者进行等待,能成功获取到令牌的请求才会进入到后端服务器。 与漏桶算法精确控制速率不太一样的是,由于令牌桶的桶本身具备一定的容量,可以允许一次把桶里的令牌全都取出,因此,令牌桶算法在限制请求的平均速率的同时,还允许一定程度的突发流量。 全局流控 对于单机瓶颈的问题,通过单机版的流控算法和组件就能很好地实现单机保护。但在分布式服务的场景下,很多时候的瓶颈点在于全局的资源或者依赖