我的编程空间,编程开发者的网络收藏夹
学习永远不晚

JavaRateLimiter的限流详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

JavaRateLimiter的限流详解

限流背景

在早期的计算机领域,限流技术(time limiting)被用做控制网络接口收发通信数据的速率。可以用来优化性能,减少延迟和提高带宽等。现在在互联网领域,也借鉴了这个概念,用来为服务控制请求的速率,如双十一的限流,12306的抢票等。即使在细粒度的软件架构中,也有类似的概念。

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

限流相关概念

在介绍限流之前先介绍几个容易混淆的概念,包括服务熔断,服务降级,服务隔离。

服务熔断

理解熔断之前先了解另一个概念:微服务的雪崩效应。因为熔断机制通常是作为应对雪崩效应的一种微服务链路保护机制。

在微服务架构中,一个微服务通常是完成一个单一业务功能的独立应用。这样做的好处是各个业务功能之间最大可能的解耦,每个微服务可以独立演进。通常一个应用可能会有很多个微服务组成,服务间通过RPC互相调用。假如有如下服务调用链路:

A,B依赖C去调用E,F。如果E服务不能正常提供服务了,C的超时重试机制将会执行。同时新的调用不断产生,会导致C对E服务的调用大量的积压,产生大量的调用等待和重试调用,慢慢会耗尽C的资源,比如内存或CPU,同时影响C调F,最终整个应用不可用。本例中由于链路上E的故障,对微服务A,B的调用就会占用越来越多的系统资源,进而引起系统崩溃,即所谓的“雪崩效应”。

熔断机制是应对雪崩效应的一种微服务链路保护机制,生活中有很多熔断的例子。比如电路中某个地方的电压过高,熔断器就会熔断,对电路进行过载保护。股市里边,如果股票指数涨跌幅过高,触及设置的熔断点后,随后的一段时间内将暂停交易。在微服务架构中的熔断机制作用类似。当调用链路的某个微服务不可用,或者响应时间太长,或者错误次数达到某个阈值,会进行服务熔断,即快速返回响应信息。当检测到该节点微服务调用响应正常后,逐步恢复正常的调用链路。

服务降级

服务降级主要是指在服务器压力陡增的情况下,根据某种策略对一些非核心服务或者页面不做请求处理或者简单处理,或者限流某个服务,从而释放服务器资源以保证核心业务正常运作或高效运作。比如京东618活动时,把无关交易的服务降级,比如关闭某个服务,或者查看历史订单,商品历史评论等非交易核心业务,只显示最近100条等。

服务隔离

隔离是指服务或者资源隔离开。服务隔离能够在服务发生故障时限定其影响范围,保证其他服务还是可用的。资源隔离一般是指通过隔离来减少服务间资源竞争。资源隔离的粒度有很多种,比如线程隔离,进程隔离,机房隔离等。线程隔离即隔离线程池资源,不同服务的执行使用不同的线程池。这样做的好处是即使其中一个服务线程池满了,也不会影响到其他的服务。比如下图中Tomcat处理请求,对每个微服务,都分配一个线程池。

服务限流

服务限流是限制请求的数量,即某个时间窗口内的请求速率。一旦达到限制速率则可以拒绝服务(定向到错误页或告知系统忙),排队等待(比如秒杀,用户评论,下单),降级(返回兜底数据或默认数据)。

比较

服务熔断,服务降级都是从系统的可用性角度考虑,防止系统响应延迟甚至崩溃而采用的技术性的系统保护手段。服务熔断一般是由某个下游服务故障引起,而服务降级一般是从整体业务的负载情况考虑,目的是为了降低系统负载。限流则是对单位时间内请求次数的限制。三者都是通过某种手段保证流量过载时系统的可用性。服务隔离则是让不同的业务使用各自独立的线程池资源,避免服务之间资源竞争的影响。

常见的限流方法

常见的限流手段有如下这些。限制总的并发数(比如数据库连接池,线程池),限制瞬时并发数(如nginx的limit_conn模块,用来限制瞬时并发连接数),限制某个时间窗口内的平均速率(RateLimiter,nginx的limit_req模块);此外还有限制RPC调用频率,限制MQ的消费速率等。

限流工具类RateLimiter

google开源工具包guava提供了限流工具类RateLimiter,该类基于“令牌桶算法”,非常方便使用。

RateLimiter 使用Demo:

import com.google.common.util.concurrent.RateLimiter;
public class RateLimiterDemo {
    public static void main(String[] args) {
//        testNoRateLimiter();
        testWithRateLimiter();
    }
    public static void testNoRateLimiter() {
        Long start = System.currentTimeMillis();
        for (int i = 0; i < 10; i++) {
            System.out.println("call execute.." + i);
        }
        Long end = System.currentTimeMillis();
        System.out.println(end - start);
    }
    public static void testWithRateLimiter() {
        Long start = System.currentTimeMillis();
        RateLimiter limiter = RateLimiter.create(10.0); // 每秒不超过10个任务被提交
        for (int i = 0; i < 20; i++) {
            limiter.acquire(); // 请求RateLimiter, 超过permits会被阻塞
            System.out.println("call execute.." + i);
        }
        Long end = System.currentTimeMillis();
        System.out.println(end - start);
    }
}

Guava版本

<dependency>
     <groupId>com.google.guava</groupId>
     <artifactId>guava</artifactId>
     <version>18.0</version>
</dependency>

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!  

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

JavaRateLimiter的限流详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java限流实现的几种方法详解

这篇文章主要介绍了Java限流实现的几种方法,通俗的说,限流就是限制一段时间内,用户访问资源的次数,减轻服务器压力,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2022-12-03

阿里云服务器的流量限制详解

本文将详细介绍阿里云服务器的流量限制,包括流量类型、流量上限、流量计费方式等内容,帮助用户更好地理解和使用阿里云服务器。在使用阿里云服务器时,了解服务器的流量限制是非常重要的。流量是指在一定时间内通过网络传输的数据量,主要包括带宽流量和数据流量。接下来,我们将深入探讨阿里云服务器的流量限制。首先,我们需要明确的是
阿里云服务器的流量限制详解
2024-01-26

SpringCloudHystrix服务降级限流策略详解

这篇文章主要为大家介绍了SpringCloudHystrix服务降级限流策略详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-01-04

详解5种Java中常见限流算法

在高并发系统中,出于系统保护角度考虑,通常会对流量进行限流;不但在工作中要频繁使用,而且也是面试中的高频考点。本文就为大家整理了5种Java中常见限流算法,需要的可以参考一下
2023-05-14

Redis实现IP限流的2种方式举例详解

目录通过reids实现通过Lua+Redis实现注意事项总结 通过reids实现限流的流程图在配置文件配置限流参数blackIP:# ip 连续请求的次数continue-counts: ${counts:3}# ip 判断的时间间隔
Redis实现IP限流的2种方式举例详解
2024-08-13

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录