Java限流计策
提纲在大数据量高并发会见时,常常会呈现处事或接口面临暴涨的哀求而不行用的环境,乃至激发连锁反应导致整个体系瓦解。此时你必要行使的技妙本领之一就是限流,当哀求到达必然的并发数或速度,就举办守候、列队、降级、拒绝处事等。在限流时,常见的两种算法是漏桶和令牌桶算法算法。 限流算法令牌桶(Token Bucket)、漏桶(leaky bucket)和计数器算法是最常用的三种限流的算法。 1. 令牌桶算法令牌桶算法的道理是体系会以一个恒定的速率往桶里放入令牌,而假如哀求必要被处理赏罚,则必要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝处事。 当桶满时,新添加的令牌被扬弃或拒绝。
令牌桶算法示例public static void exec() {
limiter.acquire(1);
try {
// 处理赏罚焦点逻辑
TimeUnit.SECONDS.sleep(1);
System.out.println("--" + System.currentTimeMillis() / 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} Guava RateLimiter 提供了令牌桶算法可用于滑腻突发限流计策。 该示例为每秒中发生5个令牌,每200毫秒会发生一个令牌。 limiter.acquire() 暗示斲丧一个令牌。当桶中有足够的令牌时,则直接返回0,不然阻塞,直到有可用的令牌数才返回,返回的值为阻塞的时刻。 2. 漏桶算法它的首要目标是节制数据注入到收集的速度,滑腻收集上的突发流量,数据可以以恣意速率流入到漏桶中。漏桶算法提供了一种机制,通过它,突发流量可以被整形以便为收集提供一个不变的流量。 漏桶可以看作是一个带有常量处事时刻的单处事器行列,假如漏桶为空,则不必要流出水滴,假如漏桶(包缓存)溢出,那么水滴会被溢出扬弃。
3. 计数器限流算法计数器限流算法也是较量常用的,首要用来限定总并发数,好比数据库毗连池巨细、线程池巨细、措施会见并发数等都是行使计数器算法。 行使计数器限流示例1private static AtomicInteger count = new AtomicInteger(0);
public static void exec() {
if (count.get() >= 5) {
System.out.println("哀求用户过多,请稍后在试!"+System.currentTimeMillis()/1000);
} else {
count.incrementAndGet();
try {
//处理赏罚焦点逻辑
TimeUnit.SECONDS.sleep(1);
System.out.println("--"+System.currentTimeMillis()/1000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
count.decrementAndGet();
}
}
}
} 行使AomicInteger来举办统计当前正在并发执行的次数,假如高出域值就简朴粗暴的直接相应给用户,声名体系忙碌,请稍后再试或其余跟营业相干的信息。
行使计数器限流示例2private static Semaphore semphore = new Semaphore(5);
public static void exec() {
if(semphore.getQueueLength()>100){
System.out.println("当前守候列队的使命数大于100,请稍候再试...");
}
try {
semphore.acquire();
// 处理赏罚焦点逻辑
TimeUnit.SECONDS.sleep(1);
System.out.println("--" + System.currentTimeMillis() / 1000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
semphore.release();
}
}
} 行使Semaphore信号量来节制并发执行的次数,假如高出域值信号量,则进入阻塞行列中列队守候获守信号量举办执行。假如阻塞行列中列队的哀求过多超出体系处理赏罚手段,则可以在拒绝哀求。
我的Java进修交换QQ群:589809992 ?榨取闲聊,非喜勿进! (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |