「java令牌桶算法例子」令牌算法和漏桶

博主:adminadmin 2022-12-28 00:12:06 60

本篇文章给大家谈谈java令牌桶算法例子,以及令牌算法和漏桶对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

求java多线程遍历目录的完整代码,能运行的那种

目录结构为树型结构,用多线程不大好做,线程最多在前几层进行分割,比如每个目录下有两个目录,共5层,那么root目录下就能启用2个线程分别进行遍历,所以第二层就启动了2个线程进行遍历,加上主线程共三个线程,虽然这样做是可以做,但是要更具实际情况进行线程的规划,否则容易线程过多导致cpu超负荷,或者假死,再提一点,遍历目录不建议用递归来写,因为目录较多容易栈溢出。

随手写了个,会有点bug就是关闭线程池的时候,还有就是有可能目录太多进入拒绝策略,这个东西 可以考虑使用令牌桶算法,或者计数器算法来做。这里提供个简单的例子。

public class TraverseUtil {

public static BlockingQueue blockingQueue = new LinkedBlockingQueue(100);

public static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(100,100,10, TimeUnit.SECONDS,blockingQueue);

public static void traverseFolder2(String path) {

File file = new File(path);

if (file.exists()) {

File[] files = file.listFiles();

if (null == files || files.length == 0) {

System.out.println("文件夹是空的!");

return;

} else {

for (File file2 : files) {

if (file2.isDirectory()) {

System.out.println("文件夹:" + file2.getAbsolutePath());

threadPoolExecutor.execute(new Runnable() {

@Override

public void run() {

traverseFolder2(file2.getAbsolutePath());

}

});

} else {

System.out.println("文件:" + file2.getAbsolutePath());

}

}

}

} else {

System.out.println("文件不存在!");

}

}

public static void main(String[] args) throws InterruptedException {

traverseFolder2("C:\\Users\\a8932\\Desktop\\md");

}

}

限流算法之漏桶、令牌桶的区别

漏桶算法(Leaky Bucket)是网络世界中流量整形(Traffic Shaping)或速率限制(Rate Limiting)时经常使用的一种算法,它的主要目的是控制数据注入到网络的速率,平滑网络上的突发流量。漏桶算法提供了一种机制,通过它,突发流量可以被整形以便为网络提供一个稳定的流量。

漏桶可以看作是一个带有常量服务时间的单服务器队列,如果漏桶(包缓存)溢出,那么数据包会被丢弃。 在网络中,漏桶算法可以控制端口的流量输出速率,平滑网络上的突发流量,实现流量整形,从而为网络提供一个稳定的流量。

如图所示,把请求比作是水,水来了都先放进桶里,并以限定的速度出水,当水来得过猛而出水不够快时就会导致水直接溢出,即拒绝服务。

可以看出,漏桶算法可以很好的控制流量的访问速度,一旦超过该速度就拒绝服务。

令牌桶算法是网络流量整形(Traffic Shaping)和速率限制(Rate Limiting)中最常使用的一种算法。典型情况下,令牌桶算法用来控制发送到网络上的数据的数目,并允许突发数据的发送。

令牌桶算法的原理是系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务。从原理上看,令牌桶算法和漏桶算法是相反的,一个“进水”,一个是“漏水”。

Google的Guava包中的RateLimiter类就是令牌桶算法的解决方案。

漏桶算法与令牌桶算法在表面看起来类似,很容易将两者混淆。但事实上,这两者具有截然不同的特性,且为不同的目的而使用。

漏桶算法与令牌桶算法的区别在于,漏桶算法能够强行限制数据的传输速率,令牌桶算法能够在限制数据的平均传输速率的同时还允许某种程度的突发传输。

需要注意的是,在某些情况下,漏桶算法不能够有效地使用网络资源,因为漏桶的漏出速率是固定的,所以即使网络中没有发生拥塞,漏桶算法也不能使某一个单独的数据流达到端口速率。因此,漏桶算法对于存在突发特性的流量来说缺乏效率。而令牌桶算法则能够满足这些具有突发特性的流量。通常,漏桶算法与令牌桶算法结合起来为网络流量提供更高效的控制。

查看原文可以戳这里

限流技术早期被应用于控制网络接口收发通信数据的速率,在互联网领域,也借鉴了这个概念,用于为服务控制请求的速率。

这段话怎么理解呢,比如说存在两个系统A、B,公用一个网络,网络带宽为2M, A、B各分得1M,此时通过漏桶算法控制两个系统使用网络的速率,A、B系统使用网络的速率固定最大值为1M,无论A、B系统接受多少流量,但流出的速率都限制在最大1M,当网络中没有发生拥塞,也就是可能出现B系统可能空闲没有使用网络,对应分给B系统的1M带宽是空闲的,而A系统这一时刻接收了5M的流量,由于漏桶限流的存在,A只能使用1M带宽,我们的带宽有2M,此刻我们只能使用1M,也就是达不到带宽的最大速率,另外1M带宽是浪费的,因此不能充分利用,缺乏效率;当然从另一方面来讲也带来了好处,就是隔离性,A系统无论收到多大的流量冲击,对于B系统的无感的,不会因为流量冲击A,而B受到影响.

这段又该怎么理解呢,比如我们的目标现在是每秒钟处理10个请求,使用漏桶法,我们设置桶的大小为10,流出的速率为0.1s流出一个请求,我们可以达成我们的目标;而使用令牌桶的话,我们会设置每1s向桶中放入10个令牌,请求如果是平稳的,每0.1s过来一个请求,来十个,同样能达到我们的目标,这里所说的某种程度的突发传输是指,比如在一秒内前0.5请求是平稳的,每0.1s来一个,但在0.6s的时候突发请求同时来个5个请求,此时令牌算法是可以承受这个突发流量的,并且让5个请求成功立刻同时通过,完成了所谓的某种程度的突发传输,而漏桶算法,也可以应对这种突发流量,但不同的是没有让5个请求同时立刻通过,而是缓冲在桶中,然后仍然以固定速率每0.1s通过一个。

这两种算法,都可以实现流速的控制,1s处理10个请求,多于10个的请求都会被拒绝,但由于漏桶算法流出速率是一定的,所以请求可能会被缓冲在桶中,不能马上得到处理,从而徒增了等待时间,而对于令牌桶算法,没有这种等待时间,有令牌则通过,无令牌则抛弃。

什么是漏桶算法和令牌桶算法

什么是令牌桶

在我们讨论突发数据量之前,我们首先要理解令牌桶的概念。令牌桶本身没有丢弃

和优先级策略,

令牌桶是这样工作的:

1. 令牌以一定的速率放入桶中。

2. 每个令牌允许源发送一定数量的比特。

3. 发送一个包,流量调节器就要从桶中删除与包大小相等的令牌数。

4. 如果没有足够的令牌发送包,这个包就会等待直到有足够的令牌(在整形

器的情况下)或者包被丢弃,也有可能被标记更低的DSCP(在策略者的情况下)。

5. 桶有特定的容量,如果桶已经满了,新加入的令牌就会被丢弃。因此,在

任何时候,源发送到网络上的最大突发数据量与桶的大小成比例。令牌桶允许突发,

但是不能超过限制。

Cisco IOS 流量策略(Traffic Policers)

IOS支持两种流量策略:

1. 传统的Cisco流量策略:CAR承诺接入速率,使用命令

Router(config-if)#rate-limit {input | output} CIR (bps)

Bc(burst-normal) Be(burst-max) conform-action action exceed-action action

2. 新型的Cisco流量策略:基于类的策略(Class-based policer),使用模

块化Qos CLI(MQC)语法。可以使用MQC命令建立流量策略并把策略应用到接口。

一个流量策略包括一个流量类(traffic class)和一个或多个Qos特性。Policy

命令用来执行流量策略特性,它指定了一个流量类所需要的最大速率,超过这个速

率Qos系统会立刻执行一个操作,标准的操作是丢弃或重置包头的DSCP字段。Policy

命令的语法是:

police cirbps Bcbc Bebe conformconform-action exceed

exceed-action violateviolate-action

理解Bc和Be

对于超额的数据包,流量策略并不会把它们缓存稍候转发,只有整形器(shaper)

会这样做。流量策略只执行一个发送或不发送的策略。因为不能缓存数据包,所以

在发生拥塞时,所能做的最好的方法就是通过配置适当的超额突发数据量Be来不那

么过分的丢弃数据包。这一点对理解流量策略使用Bc和Be来保证达到CIR是非常

重要的。

超额参数模仿路由器的通用缓存规则。The rule recommends configuring buffering

equal to the round-trip time bitrate to accommodate the outstanding TCP

windows of all connections in times of congestion.

突发参数 目的 推荐公式

普通突发 · 执行标准的令牌桶 · 设置最大数量的令牌(尽管如

果BeBc的话可以借到令牌). · 决定令牌桶有多大,因为如果桶已经满了那么令

牌将被丢弃而不会再加入到桶中。 CIR [bps] * (1 byte)/(8 bits) * 1.5

seconds Note: 1.5 seconds is the typical round trip time.

超额突发 · 为令牌桶提供超额突发能力 · 如果Bc = Be那么不

支持超额突发 · 当Bc = Be,流量调节器就不能借令牌,当令牌不够时只能丢弃数

据包 两倍的Bc

对TCP流量的测试表明,Bc 和Be的数值应该近似等于配置的平均速率在两秒钟内

的流量。如果你想限制流量在1Mb,应该把Bc 设置在1-2Mb,Be在2-4Mb。

举个例子,如果我们想把输出速率限制在1.5Mbps,我们可以做一下步骤:

1. 把承诺速率从比特转换成字节,因为突发数据量的单位为字节。

1500000 bits / 8 bits = 187500 bytes

2. 使用标准的1.5秒往返时间(round-trip time)计算Bc

187500 bytes * 1.5秒 = 281250 bytes

3. 两倍的Bc为Be

281250 bytes * 2 = 562500 bytes

使用命令

rate-limit input 1500000 281250 562500 conform-action {action}

exceed-action {action}

超额突发数据量

当数据包到达时可用的令牌数目小于包的大小,就可以使用超额突发数据量。包会

请求借用令牌。可以通过配置大于Bc的Be的数值来为令牌桶提供超额突发能力。

可以通过下面两个例子来理解Be。

第一个例子说明怎样配置CAR策略来允许所有的IP流量。管理员在T3线路上提供

了便宜的20Mbps的子速率服务。用户只花费子速率带宽的金额,也可以按需要增加

带宽。CAR限制了用户可用的流量速率,用户只能使用规定的速率加上承诺的突发

数据量。可以适当的设置Be=32000。

interface hssi 0/0/0

rate-limit output 20000000 24000 32000 conform-action transmit

exceed-action drop

下一个例子,用户只能发送24000字节的突发数据量,所有超过限制的数据包都要

被丢弃,因为设置Bc=Be,数据包流不能通过超额突发能力来借用令牌。

interface Hssi0/0/0

rate-limit output 20000000 24000 24000 conform-action transmit

exceed-action drop

正确设置突发数据量的重要性

策略以字节为单位指定了突发数据量,基于类的策略(class-based policer)支持

最小的突发数据量为1000字节,包括第二层包头。

突发数据量的目的是逐渐的丢弃数据包,就像RED那样,并且避免尾丢弃。设置足

够高的突发数据量对保证良好的吞吐量是非常重要的。

设置突发数据量时,考虑一下内容:

1. 如果突发数据量设置的过低,数据到达的速率将远远低于配置的速率。

2. 惩罚暂时突发对TCP流的吞吐量来说是相当不利的,具体情况请察看RFC

2001 and Random Early Detection (RED) gateways for Congestion Avoidance。

设置突发数据量来允许路由器容纳暂时突发。

3. 对离开接口的数据包的处理基于包的大小和桶中剩余的令牌数。

4. 在基于类的策略中,流量测量器不论接口是否拥塞都是激活的。每个包都

会经过令牌桶测量系统来决定是否符合配置的参数。

5. 如果数据突发量非常大而且非常突然,那么配置较高的超额突发数据量可

以保证超额令牌桶中存放较多的令牌。而且可以调整接口的MTU等于或大于突发数

据量大小。

允许的突发数据量数值

最初,包括IOS12.0,rate-limit命令支持承诺和超额的突发数据量的范围是:

Router1(config-if)#rate-limit input 18000000 ?

8000-2000000 Normal burst bytes

Router1(config-if)#rate-limit input 18000000 2000000 ?

8000-8000000 Maximum burst bytes

Router1(config-if)#rate-limit input 18000000 2000000

IOS12.1增加了突发数据量的最大值:

7500-107(config)#interface atm 1/0/0

7500-107(config-if)#rate-limit output ?

8000-2000000000 Bits per second

access-group Match access list

qos-group Match qos-group IDb

关于java令牌桶算法例子和令牌算法和漏桶的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

The End

发布于:2022-12-28,除非注明,否则均为首码项目网原创文章,转载请注明出处。