How to ratelimit by resilience4j

2023-10-24 09:59
文章标签 resilience4j ratelimit

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

文章目录

    • 特点
    • Resilience4j-Bulkhead
      • Semaphore模式
      • FixedThreadPool模式
    • Resilience4j-RateLimiter
      • 令牌桶算法默认实现 AtomicRateLimiter
      • 信号量实现 SemaphoreBasedRateLimiter
    • Talk is Cheap,Show you the code

特点

  • 支持jdk8函数式编程
  • 轻量级,易于使用的编程API
  • 模块化设计,将每个功能点(如熔断、限速器、自动重试)都拆成了单独的模块,使用时只需要引入相关依赖即可。
  • 使用装饰器模式对任何函数或lamda表达式进行增强。

缺点:

  • 缺乏生产级别的配套设施(如提供规则管理和实时监控能力的控制台)
  • 文档不够详细

与hystrix对比:https://resilience4j.readme.io/docs/comparison-to-netflix-hystrix

Resilience4j-Bulkhead

Resilience4j提供了两种舱壁模式(Bulkhead),可用于限制并发执行的次数:

  • SemaphoreBulkhead(信号量舱壁,默认),基于Java并发库中的Semaphore实现。
  • FixedThreadPoolBulkhead(固定线程池舱壁),它使用一个有界队列和一个固定线程池。

Semaphore模式

属性配置默认值含义
maxConcurrentCalls25舱壁允许的最大并行执行量
maxWaitDuration0尝试进入饱和舱壁时,应阻塞线程的最长时间。

FixedThreadPool模式

属性配置默认值含义
queueCapacity100Configures the capacity of the queue.
maxThreadPoolSizeRuntime.getRuntime().availableProcessors()Configures the max thread pool size.
keepAliveDuration20[ms]When the number of threads is greater than the core, this is the maximum time that excess idle threads will wait for new tasks before terminating.
coreThreadPoolSizeRuntime.getRuntime().availableProcessors() - 1Configures the core thread pool size
  • 原理:
  • FixedThreadPoolBulkhead使用一个固定线程池和一个等待队列来实现舱壁。
  • 当线程池中存在空闲时,则此时进入系统的请求将直接进入线程池开启新线程或使用空闲线程来处理请求。
  • 当线程池无空闲时接下来的请求将进入等待队列,若等待队列仍然无剩余空间时接下来的请求将直接被拒绝。
  • 在队列中的请求等待线程池出现空闲时,将进入线程池进行业务处理。

Resilience4j-RateLimiter

ratelimiter是resilience4j的限流器,提供了一下两种限流器实现。参数如下:

属性配置默认值含义
timeoutDuration5[s]等待获取许可时间
limitRefreshPeriod500 [ns]限流器刷新周期.
limitForPeriod50固定周期内的许可数.

令牌桶算法默认实现 AtomicRateLimiter

将jvm启动开始和结束之间的时间划分为一个个的cycle周期,并设置cycle内即固定刷新周期内的许可数,当线程请求达到时获取当前周期内是否有允许的许可数被获取,有则执行,否则抛出异常。
在这里插入图片描述

信号量实现 SemaphoreBasedRateLimiter

当请求线程获取到信号量时执行业务逻辑方法,如果获取不到信号量,则在超时时间内阻塞,等待信号量被释放。系统会启动一个周期性线程池按固定周期(cycle),释放已经获取到信号量的线程。
源码相关如下:

private void scheduleLimitRefresh() {scheduler.scheduleAtFixedRate(this::refreshLimit,this.rateLimiterConfig.get().getLimitRefreshPeriod().toNanos(),this.rateLimiterConfig.get().getLimitRefreshPeriod().toNanos(),TimeUnit.NANOSECONDS);}void refreshLimit() {int permissionsToRelease =this.rateLimiterConfig.get().getLimitForPeriod() - semaphore.availablePermits();semaphore.release(permissionsToRelease);}

Talk is Cheap,Show you the code


import io.github.resilience4j.bulkhead.Bulkhead;
import io.github.resilience4j.bulkhead.BulkheadConfig;
import io.github.resilience4j.bulkhead.BulkheadRegistry;
import io.github.resilience4j.bulkhead.ThreadPoolBulkhead;
import io.github.resilience4j.bulkhead.ThreadPoolBulkheadConfig;
import io.github.resilience4j.bulkhead.ThreadPoolBulkheadRegistry;
import io.github.resilience4j.ratelimiter

这篇关于How to ratelimit by resilience4j的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

005-CircuitBreaker断路器-Resilience4J

文章目录 1 CircuitBreaker1.1 实现原理1.2 一句话 2 Resilience4J2.1 是什么2.2 能干嘛2.3 怎么用 3 熔断(CircuitBreaker)(服务熔断+服务降级)3.1 断路器三大状态3.2断路器3大状态之前的转换3.3断路器所有配置参数参考3.4 熔断+降级案例需求说明3.5 COUNT_BASED(计数的滑动窗口)3.5.1 cloud-pr

Resilience4J服务熔断隔离与限流

为了保障文章的流畅性(文章穿插大量的环境搭建没意思,会干扰文章的主题,无聊的很),将环境的搭建与测试,工具的版本说明放了文末: 六、环境搭建。 一、Circuit Breaker是什么 1.1、官网 https://spring.io/projects/spring-cloud-circuitbreaker 1.2、实现原理 CircuitBreaker的目的是保护分布式系统免

Resilience4j——轻量级容错库

1. resilience4j是什么? Resilience4j是一个轻量级的容错库,受Netflix Hystrix的启发,但专为Java 8和函数式编程而设计。轻量级,因为库只使用Vavr,它没有任何其他外部库依赖项。相比之下,Netflix Hystrix对Archaius具有编译依赖性,Archaius具有更多的外部库依赖性,例如Guava和Apache Commons Configur

Circuitbreaker Resilience4j 替换Netflix Hystrix

Spring cloud 早已经不支持也不维护Netflix Hystrix了。但是项目中一直用openfeign, Feign里的fallback原来一直用Hystrix做熔断。怎么找到一个可以替换hystrix相同的东西呢?用CricuitBreaker Resilience4j可以完全替换。 在pom.xml中加入spring-cloud-starter-circuitbreaker-re

【SpringCloud】CircuitBreaker断路器之Resilience4J快速入门

【SpringCloud】CircuitBreaker断路器之Resilience4J快速入门 文章目录 【SpringCloud】CircuitBreaker断路器之Resilience4J快速入门1. 概述2. 服务熔断+服务降级(CircuitBreaker)2.1 案例说明2.1.1 基于计数的滑动窗口2.1.2 测试2.2.1 基于时间的滑动窗口2.2.2 测试 3. 隔离(B

springcloud第4季 使用resilience4j实现服务流量治理

一  前言 1.1 断路器介绍 断路器是一种开关装置,当某个服务单元发生故障后,通过断路器向调用方返回一个符合预期,可处理的备选响应。保证服务不会被长时间,不必要的占用,从而避免在分布式系统故障的蔓延、乃至雪崩。 断路器使用的判断策略有:基于访问数量的滑动窗口和基于时间的滑动窗口。 基于访问数量的滑动窗口统计最近N次调用的返回结果。 基于时间的滑动窗口统计N秒调用的返回结果。 1.2

Guava来做接口限流RateLimit

原文地址:http://blog.csdn.net/jiesa/article/details/50412027 一、问题描述     某天A君突然发现自己的接口请求量突然涨到之前的10倍,没多久该接口几乎不可使用,并引发连锁反应导致整个系统崩溃。如何应对这种情况呢?生活给了我们答案:比如老式电闸都安装了保险丝,一旦有人使用超大功率的设备,保险丝就会烧断以保护各个电器不被强电流给烧坏

【微服务】SpringBoot整合Resilience4j使用详解

目录 一、前言 二、熔断器出现背景 2.1 几个核心概念 2.1.1 熔断 2.1.2 限流 2.1.3 降级 2.2 为什么会出现熔断器 2.3 断路器介绍 2.3.1 断路器原理 三、Resilience4j介绍 3.1 Resilience4j概述 3.1.1 Resilience4j是什么 3.1.2 Resilience4j功能特性 3.2 Resilie

Resilience4J之隔离(BulkHead)

Resilience4J之隔离(BulkHead) 中文官网https://github.com/lmhmhl/Resilience4j-Guides-Chinese/blob/main/core-modules/bulkhead.md 作用是:限制并发。 依赖隔离&负载保护:用于限制对于下游服务的最大并发数量的限制 maven依赖 <!--resilience4j-bulkhead--

springcloud:3.1介绍雪崩和Resilience4j

灾难性雪崩效应 简介 服务与服务之间的依赖性,故障会传播,造成连锁反应,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的“雪崩”效应。 原因 1.服务提供者不可用(硬件故障、程序bug、缓存击穿、用户大量请求)2.重试加大流量(用户重试,代码逻辑重试)3.服务调用者不可用(同步等待造成的资源耗尽) 综上所述 在高并发访问下,系统所依赖的服务的稳定性对系统的