Sentinel sentinel限流 在高并发调用下,可能会限流不准

1l5u6lss  于 2022-10-19  发布在  其他
关注(0)|答案(1)|浏览(211)

我看源码里是否要限流。如下代码判断:

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)。那么这两千个请求 都能通过。

a0zr77ik

a0zr77ik1#

我感觉 这里可以先 incr...假如失败了 再decr (但这里可能存在ABA问题)
或者在
MetricBucket中 增加一个统计。。叫当前可能通过的统计
来请求的时候 先增加 可能通过的统计字段。如果失败 就不增加通过的。成功就增加。。。

相关问题