加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营 > 正文

Java限流策略

发布时间:2020-12-30 16:38:50 所属栏目:运营 来源:网络整理
导读:提纲 在大数据量高并发会见时,常常会呈现处事或接口面临暴涨的哀求而不行用的环境,乃至激发连锁反应导致整个体系瓦解。此时你必要行使的技妙本领之一就是限流,当哀求到达必然的并发数或速度,就举办守候、列队、降级、拒绝处事等。在限流时,常见的两种算

提纲

在大数据量高并发会见时,常常会呈现处事或接口面临暴涨的哀求而不行用的环境,乃至激发连锁反应导致整个体系瓦解。此时你必要行使的技妙本领之一就是限流,当哀求到达必然的并发数或速度,就举办守候、列队、降级、拒绝处事等。在限流时,常见的两种算法是漏桶和令牌桶算法算法。

限流算法

令牌桶(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. 计数器限流算法

计数器限流算法也是较量常用的,首要用来限定总并发数,好比数据库毗连池巨细、线程池巨细、措施会见并发数等都是行使计数器算法。

行使计数器限流示例1

private 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来举办统计当前正在并发执行的次数,假如高出域值就简朴粗暴的直接相应给用户,声名体系忙碌,请稍后再试或其余跟营业相干的信息。

破绽:行使 AomicInteger 简朴粗暴高出域值就拒绝哀求,也许只是瞬时的哀求量高,也会拒绝哀求。

行使计数器限流示例2

private 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信号量来节制并发执行的次数,假如高出域值信号量,则进入阻塞行列中列队守候获守信号量举办执行。假如阻塞行列中列队的哀求过多超出体系处理赏罚手段,则可以在拒绝哀求。

相对Atomic利益:假如是瞬时的高并发,可以使哀求在阻塞行列中列队,而不是顿时拒绝哀求,从而到达一个流量削峰的目标。

我的Java进修交换QQ群:589809992 ?榨取闲聊,非喜勿进!

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读