使用场景

系统使用下游资源时,需要考虑下游对资源受限、处理能力,在下游资源无法或者短时间内无法提升处理性能的情况下,可以使用限流器或者类似保护机制,避免下游服务崩溃造成整体服务的不可用。

常用算法

常见限流算法有两种:漏桶算法和令牌桶算法

限流的一般思路:

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; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit; /**
* @author xfyou
* @date 2018/10/31
*/
@Component
public class AccessLimitService { private static volatile int acquireCount = 0;
private static final Object OBJECT = new Object(); /**
* 每秒可以获得50个许可证
*/
private RateLimiter rateLimiter = RateLimiter.create(50); private boolean tryAcquire() {
// 等待1秒钟如果未能获取到许可证就返回false,否则返回true
return rateLimiter.tryAcquire(1, 1000, TimeUnit.MILLISECONDS);
} public static void main(String[] args) {
AccessLimitService accessLimitService = new AccessLimitService();
ExecutorService executorService = Executors.newCachedThreadPool();
for (int i = 0; i < 1000; i++) {
executorService.execute(new Runnable() {
@Override
public void run() {
if (accessLimitService.tryAcquire()) {
System.out.println("获取许可证,执行业务逻辑。");
synchronized (OBJECT) {
System.out.println(++acquireCount);
}
try {
Thread.sleep(20);
} catch (InterruptedException ex) {
//
}
} else {
System.err.println("未获取到许可证,请求可以丢弃。");
}
}
});
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
executorService.shutdown();
}
}

使用Guava的RateLimiter完成简单的大流量限流的更多相关文章

  1. 使用RateLimiter完成简单的大流量限流,抢购秒杀限流

    RateLimiter是guava提供的基于令牌桶算法的实现类,可以非常简单的完成限流特技,并且根据系统的实际情况来调整生成token的速率. 通常可应用于抢购限流防止冲垮系统:限制某接口.服务单位时 ...

  2. Guava的RateLimiter在单机限流中的正确用法

    错误使用 在实现限流时,网上的各种文章基本都会提到Guava的RateLimiter,用于实现单机的限流,并给出类似的代码: public void method() { RateLimiter ra ...

  3. 实战限流(guava的RateLimiter)

    关于限流 常用的限流算法有漏桶算法和令牌桶算法,guava的RateLimiter使用的是令牌桶算法,也就是以固定的频率向桶中放入令牌,例如一秒钟10枚令牌,实际业务在每次响应请求之前都从桶中获取令牌 ...

  4. 一个轻量级的基于RateLimiter的分布式限流实现

    上篇文章(限流算法与Guava RateLimiter解析)对常用的限流算法及Google Guava基于令牌桶算法的实现RateLimiter进行了介绍.RateLimiter通过线程锁控制同步,只 ...

  5. 常用限流算法与Guava RateLimiter源码解析

    在分布式系统中,应对高并发访问时,缓存.限流.降级是保护系统正常运行的常用方法.当请求量突发暴涨时,如果不加以限制访问,则可能导致整个系统崩溃,服务不可用.同时有一些业务场景,比如短信验证码,或者其它 ...

  6. 超详细的Guava RateLimiter限流原理解析

    超详细的Guava RateLimiter限流原理解析  mp.weixin.qq.com 点击上方“方志朋”,选择“置顶或者星标” 你的关注意义重大! 限流是保护高并发系统的三把利器之一,另外两个是 ...

  7. 业务限流场景简单实现方案:RateLimiter

    前因:因为本系统中,有大数据高并发的场景.在向下游系统发送请求的时候,需要限流.否则会造成下游系统的堵塞. 实现方案1: Thread.sleep(ms). 优点:简单粗暴,一行代码搞定 缺点:有点l ...

  8. 【Guava】使用Guava的RateLimiter做限流

    一.常见的限流算法 目前常用的限流算法有两个:漏桶算法和令牌桶算法. 1.漏桶算法 漏桶算法的原理比较简单,请求进入到漏桶中,漏桶以一定的速率漏水.当请求过多时,水直接溢出.可以看出,漏桶算法可以强制 ...

  9. Guava RateLimiter实现接口API限流

    一.简介 Guava提供的RateLimiter可以限制物理或逻辑资源的被访问速率.RateLimit二的原理类似与令牌桶,它主要由许可发出的速率来定义,如果没有额外的配置,许可证将按每秒许可证规定的 ...

随机推荐

  1. Hdu-2008

    杭电OJ-2008 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2008 #include<stdio.h> int main() { i ...

  2. debian9 开启rc.local服务

    由于某些软件并没有增加开启启动的服务,很多时候需要手工添加,一般我们都是推荐添加命令到 /etc/rc.local 文件,但是 Debian 9 默认不带 /etc/rc.local 文件,而 rc. ...

  3. 【LeetCode算法-9】Palindrome Number

    LeetCode第9题 Determine whether an integer is a palindrome. An integer is a palindrome when it reads t ...

  4. Nowcoder contest 392 I 逛公园 (无向图割边模板)

    <题目链接> 题目描述: 月月和华华一起去逛公园了.公园很大,为了方便,可以抽象的看成一个N个点M条边的无向连通图(点是景点,边是道路).公园唯一的入口在1号点,月月和华华要从这里出发,并 ...

  5. HDU 3861 The King’s Problem (强连通缩点+DAG最小路径覆盖)

    <题目链接> 题目大意: 一个有向图,让你按规则划分区域,要求划分的区域数最少. 规则如下:1.所有点只能属于一块区域:2,如果两点相互可达,则这两点必然要属于同一区域:3,区域内任意两点 ...

  6. Mybatis之占位符与拼接符

    1.占位符 1.1  含义: 在持久化框架中,为了将约束条件中的可变参数从sql中分离出来,在原有的参数位置使用特殊的标记来标记该位置,后期通过代码给sql传递参数(即实现sql与代码分离开).这个特 ...

  7. BZOJ-8-2115: [Wc2011] Xor

    https://www.lydsy.com/JudgeOnline/problem.php?id=2115 题意 : 给出一个连通无向图,求从1到n异或和最小的路径. 思路 :随意找一条简单路径 1- ...

  8. Windows上搭建安卓的Java开发环境

    下载安装JDK path的系统变量增加值(示例): D:\Program Files\Java\jdk1.8.0_25\bin同理为名为classpath的系统变量增加值(示例:没有的话可以新建)D: ...

  9. vuex那些事儿

    vuex适用于大型单页应用.每一个Vuex应用的核心就是store(仓库),store中储存大量状态,Vuex的状态存储是响应式的.vuex使用单一状态树,一个对象包含了全部的应用层级状态,每个应用仅 ...

  10. Units of CSS

    地址:https://www.w3schools.com/css/css_units.asp https://www.cnblogs.com/xiaohuochai/p/5485683.html em ...