RateLimiterController 详解
这一篇文章主要介绍Sentinel中关于匀速排队的限流机制。
匀速排队限流的核心思想是以固定的时间间隔让请求通过,当请求到来时如果当前请求距离上个请求通过的时间间隔不小于预设的值则让请求通过。否则,计算当前请求预期通过时间,如果当前请求通过的时间小于预设的timeout时间,则计算当前时间与预设时间的差值,休眠等待直到预设时间到来(排队等待处理)。若预期时间大于timeout时间则拒接该请求通过。
这种限流机制主要是限制突发流量,这时我们不希望把所有的请求都通过,因为这样做可能会把系统压垮;同时我们也期待系统能稳定的逐步处理这些请求,以起到“削峰填谷”的效果,而不是拒绝所有请求。
1.RateLimiterController源码解析
使用匀速排队限流时需要设置FlowRule的controlBehavior为RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER
FlowRule rule1 = new FlowRule();
rule1.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER);
1.1RateLimiterController类属性:
/**
* 最大等待超时时间
*/
private final int maxQueueingTimeMs;
/**
* 限流阈值
*/
private final double count;
/**
* 最新的一次通过时间,这是一个原子变量
*/
private final AtomicLong latestPas