1.漏桶算法(假设qps=10)
1.首先初始化capacity=qps,代表桶的容量。且这个容量每秒会流失capacity的水,空了就不流。一旦水满出去,溢出的就是拒绝的请求。
2.当一个请求进来的时候,计算(now-lastTime)/1000*capacity,知道间隔时间流出了多少水,然后获取remainCapacity,如果remainCapacity还是小于桶容量的,那么加水,否则就溢出。
3.自己加的水成功流出,才能执行下一步,所以会阻塞等待个(remainCapacity/capacity)秒的时间。
lock.lock();
try {
long now = System.currentTimeMillis();
double outWater = ((now - lastTime)/1000.0) * capacity; // 计算这段时间匀速流出的水
lastTime = now;
remainWater = Math.max(0, remainWater - outWater);
if (remainWater + 1 <= capacity) {
remainWater += 1;
long waitingMs = (long)((remainWater / capacity) * 1000); // 计算刚加入的水滴完全滴出漏桶需要的时间(毫秒)
lock.unlock();
try {