限流的一般思路: 1.随机丢弃一定规则的用户(迅速过滤掉90%的用户): 2.MQ削峰(比如设一个MQ可以容纳的最大消息量,达到这个量后MQ给予reject): 3.业务逻辑层使用RateLimiter进行限流: 4.最终可以承受的流量到达DB层. package ratelimiter; import com.google.common.util.concurrent.RateLimiter; import org.springframework.stereotype.Component; i…
RateLimiter是guava提供的基于令牌桶算法的实现类,可以非常简单的完成限流特技,并且根据系统的实际情况来调整生成token的速率. 通常可应用于抢购限流防止冲垮系统:限制某接口.服务单位时间内的访问量,譬如一些第三方服务会对用户访问量进行限制:限制网速,单位时间内只允许上传下载多少字节等. 下面来看一些简单的实践,需要先引入guava的maven依赖. 一 有很多任务,但希望每秒不超过N个 import com.google.common.util.concurrent.RateLi…
错误使用 在实现限流时,网上的各种文章基本都会提到Guava的RateLimiter,用于实现单机的限流,并给出类似的代码: public void method() { RateLimiter rateLimiter = RateLimiter.create(10); if(rateLimiter.tryAcquire()){ // do business ...... } } 可是上面的代码真的能限流吗? 首先,从代码逻辑角度来讲,方法在每次被调用是都new一个RateLimiter,不同请…
关于限流 常用的限流算法有漏桶算法和令牌桶算法,guava的RateLimiter使用的是令牌桶算法,也就是以固定的频率向桶中放入令牌,例如一秒钟10枚令牌,实际业务在每次响应请求之前都从桶中获取令牌,只有取到令牌的请求才会被成功响应,获取的方式有两种:阻塞等待令牌或者取不到立即返回失败,下图来自网上: 本次实战,我们用的是guava的RateLimiter,场景是spring mvc在处理请求时候,从桶中申请令牌,申请到了就成功响应,申请不到时直接返回失败: 源码下载 对于的源码可以在我的gi…
上篇文章(限流算法与Guava RateLimiter解析)对常用的限流算法及Google Guava基于令牌桶算法的实现RateLimiter进行了介绍.RateLimiter通过线程锁控制同步,只适用于单机应用,在分布式环境下,虽然有像阿里Sentinel的限流开源框架,但对于一些小型应用来说未免过重,但限流的需求在小型项目中也是存在的,比如获取手机验证码的控制,对资源消耗较大操作的访问频率控制等.本文介绍最近写的一个基于RateLimiter,适用于分布式环境下的限流实现,并使用sprin…
在分布式系统中,应对高并发访问时,缓存.限流.降级是保护系统正常运行的常用方法.当请求量突发暴涨时,如果不加以限制访问,则可能导致整个系统崩溃,服务不可用.同时有一些业务场景,比如短信验证码,或者其它第三方API调用,也需要提供必要的访问限制支持.还有一些资源消耗过大的请求,比如数据导出等(参考 记一次线上Java服务CPU 100%处理过程 ),也有限制访问频率的需求. 常见的限流算法有令牌桶算法,漏桶算法,与计数器算法.本文主要对三个算法的基本原理及Google Guava包中令牌桶算法的实…
超详细的Guava RateLimiter限流原理解析  mp.weixin.qq.com 点击上方“方志朋”,选择“置顶或者星标” 你的关注意义重大! 限流是保护高并发系统的三把利器之一,另外两个是缓存和降级.限流在很多场景中用来限制并发和请求量,比如说秒杀抢购,保护自身系统和下游系统不被巨型流量冲垮等.  限流的目的是通过对并发访问/请求进行限速或者一个时间窗口内的的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务或进行流量整形.  常用的限流方式和场景有:限制总并发数(比如数据库连接…
前因:因为本系统中,有大数据高并发的场景.在向下游系统发送请求的时候,需要限流.否则会造成下游系统的堵塞. 实现方案1: Thread.sleep(ms). 优点:简单粗暴,一行代码搞定 缺点:有点low,万一线程被抢了,无法唤醒怎么办 实现方案2: Guava的RateLimiter类 优点:简单实用,满足简单业务场景的需求.2行代码就能搞定 缺点:功能还是比较简单,限流方案限定在秒级 实现方案3: RXJava的flowable 说明:比RateLimiter复杂,但是功能强大.还没仔细研究…
一.常见的限流算法 目前常用的限流算法有两个:漏桶算法和令牌桶算法. 1.漏桶算法 漏桶算法的原理比较简单,请求进入到漏桶中,漏桶以一定的速率漏水.当请求过多时,水直接溢出.可以看出,漏桶算法可以强制限制数据的传输速度. 2.令牌桶算法 令牌桶算法的原理是系统以一定速率向桶中放入令牌,如果有请求时,请求会从桶中取出令牌,如果能取到令牌,则可以继续完成请求,否则等待或者拒绝服务.这种算法可以应对突发程度的请求,因此比漏桶算法好. 在 Wikipedia 上,令牌桶算法是这么描述的: 每秒会有 r…
一.简介 Guava提供的RateLimiter可以限制物理或逻辑资源的被访问速率.RateLimit二的原理类似与令牌桶,它主要由许可发出的速率来定义,如果没有额外的配置,许可证将按每秒许可证规定的固定速度分配,许可将被平滑地分发,若请求超过permitsPerSecond则RateLimiter按照每秒1/permitsPerSecond的速率释放许可. 使用RateLimiter需要引入的jar包: <!-- Guava是一种基于开源的Java库,谷歌很多项目使用它的很多核心库.这个库是为…