我看源码里是否要限流。如下代码判断:
StatisticSlot.entry方法:
fireEntry(context, resourceWrapper, node, count, prioritized, args);
// Request passed, add thread count and pass count.
node.increaseThreadNum();
node.addPassRequest(count);
这里是先进行了 限流判断。再决定是否累加qps数。
DefaultController.canPass方法:
int curCount = avgUsedTokens(node); //获取当前的流量统计
if (curCount + acquireCount > count) {
if (prioritized && grade == RuleConstant.FLOW_GRADE_QPS) {
long currentTime;
long waitInMs;
currentTime = TimeUtil.currentTimeMillis();
waitInMs = node.tryOccupyNext(currentTime, acquireCount, count);
if (waitInMs < OccupyTimeoutProperty.getOccupyTimeout()) {
node.addWaitingRequest(currentTime + waitInMs, acquireCount);
node.addOccupiedPass(acquireCount);
sleep(waitInMs);
// PriorityWaitException indicates that the request will pass after waiting for {@link @waitInMs}.
throw new PriorityWaitException(waitInMs);
}
}
return false;
}
return true;
假设限流设置1000个。假如进来2000个请求 同时执行到 canpass方法的 if (curCount + acquireCount > count)。那么这两千个请求 都能通过。
1条答案
按热度按时间a0zr77ik1#
我感觉 这里可以先 incr...假如失败了 再decr (但这里可能存在ABA问题)
或者在
MetricBucket中 增加一个统计。。叫当前可能通过的统计
来请求的时候 先增加 可能通过的统计字段。如果失败 就不增加通过的。成功就增加。。。