RateLimiter超时

2024-08-31 04:36
文章标签 超时 ratelimiter

本文主要是介绍RateLimiter超时,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

案例

public static void main(String[] args) {// 创建一个RateLimiter,速率为每秒1个许可RateLimiter rateLimiter = RateLimiter.create(1.0);// 预先消耗所有的初始许可rateLimiter.acquire(1);// 创建并启动多个线程来模拟高并发for (int i = 0; i < 5; i++) {final int threadNumber = i;new Thread(() -> {long start = System.currentTimeMillis();boolean acquired = rateLimiter.tryAcquire(1, 1000, TimeUnit.MILLISECONDS);long end = System.currentTimeMillis();long diff = end - start;if (acquired) {System.out.println("Thread " + threadNumber + " acquired permit: " + diff + " ms");} else {System.out.println("Thread " + threadNumber + " could not acquire permit (timeout): " + diff + " ms");}}).start();}
}

输出结果

Thread 4 could not acquire permit (timeout): 0 ms
Thread 1 could not acquire permit (timeout): 0 ms
Thread 2 could not acquire permit (timeout): 0 ms
Thread 3 could not acquire permit (timeout): 0 ms
Thread 0 acquired permit: 999 ms

解释

官方注解

Acquires the given number of permits from this RateLimiter if it can be obtained without exceeding the specified timeout, or returns false immediately (without waiting) if the permits would not have been granted before the timeout expired.
获取指定数量的许可,如果可以在不超过指定超时时间的情况下获得许可,否则立即返回 false(不等待),如果许可在超时之前不能被授予。

在单线程示例中,每次调用大约等待一秒钟就能获得许可,因此不会抛出任何异常。这是你的代码中发生的情况:

  1. 第一次调用知道可以立即获得许可,所以它立即获得许可。
  2. 在第一次调用完成后,第二次调用知道如果等待大约 1 秒钟可以获得许可,所以它等待大约 1 秒并获得许可。
  3. 在第二次调用完成后,第三次调用知道如果等待大约 1 秒钟可以获得许可,所以它等待大约 1 秒并获得许可。
  4. 在第三次调用完成后,第四次调用知道如果等待大约 1 秒钟可以获得许可,所以它等待大约 1 秒并获得许可。
  5. 程序结束。

现在,尝试在多线程示例中使用这个,你将开始看到一些失败和一些成功。因为它们都想同时获得许可。

  1. 第一个获得许可的线程很高兴。
  2. 然后第二个线程知道如果等待大约 1 秒钟,它可以获得许可,所以它等待直到获得许可。
  3. 第三个和第四个线程看到队列中已经有两个调用,知道它们必须等待 2 秒钟才能获得许可。所以它们放弃了,因为你设置的 1 秒超时已经超过了 2 秒。

在这个多线程示例中,你会看到多个线程同时尝试获取许可时,会出现一些线程成功获取许可,而其他线程因超时而失败。

总结

  1. tryAcquire的超时参数,是在预期超时之前能够获取到令牌才会阻塞等待,否则会理解返回获取失败

这篇关于RateLimiter超时的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1122906

相关文章

Java CompletableFuture如何实现超时功能

《JavaCompletableFuture如何实现超时功能》:本文主要介绍实现超时功能的基本思路以及CompletableFuture(之后简称CF)是如何通过代码实现超时功能的,需要的... 目录基本思路CompletableFuture 的实现1. 基本实现流程2. 静态条件分析3. 内存泄露 bug

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

Springboot使用RabbitMQ实现关闭超时订单(示例详解)

《Springboot使用RabbitMQ实现关闭超时订单(示例详解)》介绍了如何在SpringBoot项目中使用RabbitMQ实现订单的延时处理和超时关闭,通过配置RabbitMQ的交换机、队列和... 目录1.maven中引入rabbitmq的依赖:2.application.yml中进行rabbit

Android WebView的加载超时处理方案

《AndroidWebView的加载超时处理方案》在Android开发中,WebView是一个常用的组件,用于在应用中嵌入网页,然而,当网络状况不佳或页面加载过慢时,用户可能会遇到加载超时的问题,本... 目录引言一、WebView加载超时的原因二、加载超时处理方案1. 使用Handler和Timer进行超

Java后端微服务架构下的API限流策略:Guava RateLimiter

Java后端微服务架构下的API限流策略:Guava RateLimiter 大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿! 在微服务架构中,API限流是保护服务不受过度使用和拒绝服务攻击的重要手段。Guava RateLimiter是Google开源的Java库中的一个组件,提供了简单易用的限流功能。 API限流概述 API限流通过控制请求的速率来防止

谈谈经典限流方法—漏桶、令牌桶与Guava RateLimiter的实现

大数据技术与架构 点击右侧关注,大数据开发领域最强公众号! 暴走大数据 点击右侧关注,暴走大数据! 高并发的业务系统经常要接受大流量的考验,为了保证系统的响应度和稳定性,往往都需要对有风险的接口实施限流(rate limiting),更高大上的说法则是“流量整形”(traffic shaping)。限流的思想最初来源于计算机网络,有两种经典的方法:漏桶和令牌桶。本文先来稍微研究一下它们。

经典限流方法——漏桶、令牌桶与Guava RateLimiter的实现

点击上方蓝色字体,选择“设为星标” 回复”资源“获取更多资源 大数据技术与架构 点击右侧关注,大数据开发领域最强公众号! 暴走大数据 点击右侧关注,暴走大数据! 高并发的业务系统经常要接受大流量的考验,为了保证系统的响应度和稳定性,往往都需要对有风险的接口实施限流(rate limiting),更高大上的说法则是“流量整形”(traffic shaping)。限流的思想最初来源于计算机

超时重试与风险学习

转自:https://juejin.cn/post/7085140011985109029,https://www.51cto.com/article/708109.html https://www.infoq.cn/article/5fboevkal0gvgvgeac4z, RPC的超时设置,一不小心就是线上事故-腾讯云开发者社区-腾讯云,有例子。 1.为何rpc超时重试 微服务节点之间的

尚品汇-延迟插件实现订单超时取消(四十五)

目录: (1)延迟插件封装 (2)基于延迟插件测试         如何保证消息幂等性? (3)改造订单service-order模块-实现订单超时取消 (1)延迟插件封装          把消息带过去:  在消息的重试发送消息的方法里封装:retrySendMsg (2)基于延迟插件测试 service-order模块  rabbit-util模块配置

spring boot mysql 8小时连接超时

使用springboot 线程池连接MySQL时,mysql数据库wait_timeout 为8个小时,所以程序第二天发现报错,在url配置了 autoReconnect=true 也不行,正确配置以下     #验证连接的有效性spring.datasource.test-while-idle=true#获取连接时候验证,会影响性能spring.datasource.test-on-bor