Dubbo一

Dubbo (一) - RPC

限流策略

DefaultTPSLimiter 有一个 Map:

1
2
private final ConcurrentMap<String, StatItem> stats
= new ConcurrentHashMap<String, StatItem>();

Map 中存储的是:

1
2
3
4
5
int rate = url.getParameter(Constants.TPS_LIMIT_RATE_KEY, -1);
long interval = url.getParameter(Constants.TPS_LIMIT_INTERVAL_KEY,
Constants.DEFAULT_TPS_LIMIT_INTERVAL);
String serviceKey = url.getServiceKey();
stats.putIfAbsent(serviceKey, new StatItem(serviceKey, rate, interval));

限流两大决定点:

  • 频率
  • 间隔

位于类 StatItem 中限流的核心算法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public boolean isAllowable(URL url, Invocation invocation) {
long now = System.currentTimeMillis();
// reset rate to initial rate
if (now > lastResetTime + interval) {
token.set(rate);
lastResetTime = now;
}

// rate--
int value = token.get();
boolean flag = false;
while (value > 0 && !flag) {
flag = token.compareAndSet(value, value - 1);
value = token.get();
}

return flag;
}

在指定间隔内调用的次数不超过 rate

过滤

代理工厂

协议

Dubbo 支持的远程调用协议:

参考

推荐文章