Hystrix和Guava RateLimiter对比

8 篇文章 0 订阅
7 篇文章 0 订阅

一、关于限流&熔断&降级的说明

为什么要限流、降级、熔断(为什么要用hystrix)

Hystrix 配置参数全解析

二、限流

1、Guava的RateLimiter

Guava的RateLimiter的API

//限制速率为1秒10个请求,2是热身参数-以一种平滑的方式把1秒内的发放令牌的速率放大到最大(适用于初始化时间比较久或者使用了连接池的应用)

//该限流器是非公平令牌桶算法

private RateLimiter switchRateLimiter = RateLimiter.create(10,2, TimeUnit.MILLISECONDS);
 
//尝试获取一个执行的机会,成功返回true,失败的话则立即false,不排队,想排队用acquire
if(!switchRateLimiter.tryAcquire()){
    //do your method
}else{
   //do your limited method
}

2、hystrix的threadpool

@HystrixCommand(defaultFallback = "defaultFallback",//默认的降级方法,可以无参数

        fallbackMethod = "xxxFallback",//指定的降级方法,要求和代理方法同参数

threadPoolProperties = {
        @HystrixProperty(name = "coreSize", value = "20"),//核心线程数
        @HystrixProperty(name = "maxQueueSize", value = "20"),//队列最大值
         @HystrixProperty(name = "queueSizeRejectionThreshold", value = "20")//队列长度到达该值则走降级策略
}

Hystrix 内线程池的使用是基于 Java 内置线程池的简单包装,通常有以下三种状态:

  • 如果请求量少,达不到 coreSize,通常会使用核心线程来执行任务。

  • 如果设置了 maxQueueSize,当请求数超过了 coreSize, 通常会把请求放到 queue 里,待核心线程有空闲时消费。

  • 如果 queue 长度无法存储请求,则会创建新线程执行直到达到 maximumSize 最大线程数,多出核心线程数的线程会在空闲时回收。

 

三、熔断(过载保护)

1、hystirx熔断

commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "500"),//执行时间超过500ms,直接报异常,走降级策略
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "5"), // 设置当请求失败的数量达到10个后,打开断路器,默认值为20
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"), // 设置打开断路器多久以后开始尝试恢复,默认为5s
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60"), // 设置出错百分比阈值,当达到此阈值后,打开断路器,默认50%
}

熔断器有 开-关-半开 状态,初始是关状态,被触发后进入开状态,指定时间后会半开,随后根据条件进入开或者关状态

四、降级

1、hystrix服务降级

@HystrixCommand(defaultFallback = "defaultFallback",//默认的降级方法,可以无参数

        fallbackMethod = "xxxFallback",//指定的降级方法,要求和代理方法同参数

被限流和被熔断保护期间的调用会被进行降级处理,进入备用方法(fallback),避免服务雪崩。

五、对一个方法做限流&熔断&降级的完整配置

@HystrixCommand(defaultFallback = "defaultFallback",fallbackMethod = "queryFlowProductOrderUnityListFallback", threadPoolProperties = {
        @HystrixProperty(name = "coreSize", value = "20"),//核心线程数
 @HystrixProperty(name = "maxQueueSize", value = "20"),//核心线程数
 @HystrixProperty(name = "queueSizeRejectionThreshold", value = "20")//队列长度到达该值则走降级策略
}, commandProperties = {
        @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "500"),//执行时间超过500ms,直接报异常,走降级策略
 @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "5"), // 设置当请求失败的数量达到10个后,打开断路器,默认值为20
 @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"), // 设置打开断路器多久以后开始尝试恢复,默认为5s
 @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60"), // 设置出错百分比阈值,当达到此阈值后,打开断路器,默认50%
})
public Object queryFlowProductOrderUnityList(

public Object queryFlowProductOrderUnityListFallback(){}
public Object defaultFallback(){}

 

六、核心思想&算法

 

1、令牌桶和漏桶算法

令牌桶和漏桶算法

令牌桶和RateLimiter实现

2、关于hystrix的限流和guava-Ratelimiter的限流

hystrix限制的是并发数,受配置和响应时间影响

RateLimiter限制的是流量本身,而不在后续处理消耗多少时间,属于流量整形

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值