mwc校准油门_编写下载服务器。 第五部分:油门下载速度

mwc校准油门

在僵尸网络时代,您可以租用几百美元来运行自己的分布式拒绝服务攻击,拥有紧急开关来有选择地关闭昂贵的功能或严重降低性能是一个巨大的胜利。 在缓解问题的同时,您的应用程序仍可运行。 当然,这种安全措施在高峰或工作时间也很有价值。 应用于下载服务器的这种机制之一是动态限制下载速度。 为了防止分布式拒绝服务攻击和过高的云发票,请考虑内置的下载限制,您可以在运行时启用并进行调整。 这样做的目的是限制全局或每个客户端的最大下载速度(IP,Connection,Cookie,用户代理)。

我必须承认,我喜欢java.io设计,其中包含许多简单的Input / OutputStreamReader / Writer实现,每个实现只承担一项责任。 您要缓冲吗? GZIPing? 字符编码? 文件系统编写? 只需编写始终可相互配合的所需类。 好的,它仍然处于阻塞状态,但是它是在被动式赶时髦的人出生之前设计的。 没关系, java.io也遵循开闭原则 :只需插入新的装饰器,就可以简单地增强现有的I / O代码而无需接触内置类。 因此,我为InputStream创建了一个简单的装饰器,以减慢我们这一边的资源读取速度,以强制执行给定的下载速度。 我正在使用我最喜欢的RateLimiter类 :

public class ThrottlingInputStream extends InputStream {private final InputStream target;private final RateLimiter maxBytesPerSecond;public ThrottlingInputStream(InputStream target, RateLimiter maxBytesPerSecond) {this.target = target;this.maxBytesPerSecond = maxBytesPerSecond;}@Overridepublic int read() throws IOException {maxBytesPerSecond.acquire(1);return target.read();}@Overridepublic int read(byte[] b) throws IOException {maxBytesPerSecond.acquire(b.length);return target.read(b);}@Overridepublic int read(byte[] b, int off, int len) throws IOException {maxBytesPerSecond.acquire(len);return target.read(b, off, len);}//less important below...@Overridepublic long skip(long n) throws IOException {return target.skip(n);}@Overridepublic int available() throws IOException {return target.available();}@Overridepublic synchronized void mark(int readlimit) {target.mark(readlimit);}@Overridepublic synchronized void reset() throws IOException {target.reset();}@Overridepublic boolean markSupported() {return target.markSupported();}@Overridepublic void close() throws IOException {target.close();}
}

任意InputStream可以与ThrottlingInputStream打包在一起,这样实际上会减慢读取速度。 您可以为每个ThrottlingInputStream创建一个新的RateLimiter ,也可以为所有下载共享一个全局RateLimiter 。 当然,有人可能会争辩说,简单的sleep()RateLimiter在下面执行的操作)会浪费大量资源,但是让我们保持此示例简单,避免非阻塞I / O。 现在我们可以轻松地将装饰器插入:

private InputStreamResource buildResource(FilePointer filePointer) {final InputStream inputStream = filePointer.open();final RateLimiter throttler = RateLimiter.create(64 * FileUtils.ONE_KB);final ThrottlingInputStream throttlingInputStream = new ThrottlingInputStream(inputStream, throttler);return new InputStreamResource(throttlingInputStream);
}

上面的示例将下载速度限制为64 KiB / s –显然,在现实生活中,您希望可配置此类编号,最好在运行时进行配置。 顺便说一句,我们已经讨论了Content-Length标头的重要性。 如果您使用pv监视下载进度,它将正确估计剩余时间,这是一个不错的功能:

~ $ curl localhost:8080/download/4a8883b6-ead6-4b9e-8979-85f9846cab4b | pv > /dev/null% Total    % Received % Xferd  Average Speed   Time    Time     Time  CurrentDload  Upload   Total   Spent    Left  Speed0 71.2M    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0  16kB 0:00:01 [14,8kB/s]0 71.2M    0 40960    0     0  30097      0  0:41:21  0:00:01  0:41:20 30095  80kB 0:00:02 [  64kB/s]0 71.2M    0  104k    0     0  45110      0  0:27:35  0:00:02  0:27:33 45106 144kB 0:00:03 [  64kB/s]0 71.2M    0  168k    0     0  51192      0  0:24:18  0:00:03  0:24:15 51184 208kB 0:00:04 [  64kB/s]0 71.2M    0  232k    0     0  54475      0  0:22:51  0:00:04  0:22:47 54475 272kB 0:00:05 [63,9kB/s]0 71.2M    0  296k    0     0  56541      0  0:22:00  0:00:05  0:21:55 67476 336kB 0:00:06 [  64kB/s]0 71.2M    0  360k    0     0  57956      0  0:21:28  0:00:06  0:21:22 65536 400kB 0:00:07 [  64kB/s]0 71.2M    0  424k    0     0  58986      0  0:21:06  0:00:07  0:20:59 65536 464kB 0:00:08 [  64kB/s]0 71.2M    0  488k    0     0  59765      0  0:20:49  0:00:08  0:20:41 65536 528kB 0:00:09 [  64kB/s]0 71.2M    0  552k    0     0  60382      0  0:20:36  0:00:09  0:20:27 65536 592kB 0:00:10 [  64kB/s]0 71.2M    0  616k    0     0  60883      0  0:20:26  0:00:10  0:20:16 65536 656kB 0:00:11 [  64kB/s]0 71.2M    0  680k    0     0  61289      0  0:20:18  0:00:11  0:20:07 65536 720kB 0:00:12 [  64kB/s]

作为一个额外的奖励, pv证明了我们的节流作用(上一栏)。 现在,没有Content-Length pv对实际的进展一无所知:

~ $ curl localhost:8080/download/4a8883b6-ead6-4b9e-8979-85f9846cab4b | pv > /dev/null% Total    % Received % Xferd  Average Speed   Time    Time     Time  CurrentDload  Upload   Total   Spent    Left  Speed
100 16384    0 16384    0     0  21116      0 --:--:-- --:--:-- --:--:-- 21113  32kB 0:00:01 [  31kB/s]
100 81920    0 81920    0     0  46149      0 --:--:--  0:00:01 --:--:-- 46126  96kB 0:00:02 [  64kB/s]
100  144k    0  144k    0     0  53128      0 --:--:--  0:00:02 --:--:-- 53118 160kB 0:00:03 [  64kB/s]
100  208k    0  208k    0     0  56411      0 --:--:--  0:00:03 --:--:-- 56406 224kB 0:00:04 [  64kB/s]
100  272k    0  272k    0     0  58328      0 --:--:--  0:00:04 --:--:-- 58318 288kB 0:00:05 [  64kB/s]
100  336k    0  336k    0     0  59574      0 --:--:--  0:00:05 --:--:-- 65536 352kB 0:00:06 [  64kB/s]
100  400k    0  400k    0     0  60450      0 --:--:--  0:00:06 --:--:-- 65536 416kB 0:00:07 [  64kB/s]
100  464k    0  464k    0     0  61105      0 --:--:--  0:00:07 --:--:-- 65536 480kB 0:00:08 [  64kB/s]
100  528k    0  528k    0     0  61614      0 --:--:--  0:00:08 --:--:-- 65536 544kB 0:00:09 [  64kB/s]
100  592k    0  592k    0     0  62014      0 --:--:--  0:00:09 --:--:-- 65536 608kB 0:00:10 [  64kB/s]
100  656k    0  656k    0     0  62338      0 --:--:--  0:00:10 --:--:-- 65536 672kB 0:00:11 [  64kB/s]
100  720k    0  720k    0     0  62612      0 --:--:--  0:00:11 --:--:-- 65536 736kB 0:00:12 [  64kB/s]

我们看到数据正在流动,但是我们不知道还剩下多少。 因此, Content-Length是一个非常重要的标头。

编写下载服务器

  • 第一部分:始终流式传输,永远不要完全保留在内存中
  • 第二部分:标头:Last-Modified,ETag和If-None-Match
  • 第三部分:标头:内容长度和范围
  • 第四部分:有效地执行HEAD操作
  • 第五部分:油门下载速度
  • 第六部分:描述您发送的内容(内容类型等)
  • 这些文章中开发的示例应用程序可在GitHub上找到。

翻译自: https://www.javacodegeeks.com/2015/07/writing-a-download-server-part-v-throttle-download-speed.html

mwc校准油门

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/337212.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sql 非主键每年自增_或许你不知道的 10 条 SQL 技巧

上文我们简述了 SQL 的一些进阶技巧,一些朋友觉得不过瘾,我们继续来下篇,再送你 10 个技巧一、 使用延迟查询优化 limit [offset], [rows]经常出现类似以下的 SQL 语句:SELECT * FROM film LIMIT 100000, 10offset 特别大!这是我司出现很多慢…

C语言最全入门笔记

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删c语言入门C语言一经出现就以其功能丰富、表达能力强、灵活方便、应用面广等特点迅速在全世界普及和推广。C语言不但执行效率高而且可移植性好&am…

yolo v4 python_YOLOv4: Darknet 如何于 Ubuntu 编译,及使用 Python 接口

本文将介绍 YOLOv4 官方 Darknet 实现,如何于 Ubuntu 18.04 编译,及使用 Python 接口。主要内容有:准备基础环境: Nvidia Driver, CUDA, cuDNN, CMake, Python编译应用环境: OpenCV, Darknet用预训练模型进行推断&…

junit测试spring_使用Spring JUnit规则进行参数化集成测试

junit测试springSpring 4.2附带了全新的JUnit规则: SpringClassRule和SpringMethodRule 。 使用JUnit规则的主要优点是让开发人员摆脱SpringJUnit4ClassRunner并在Spring集成测试中利用不同的JUnit运行器。 我认为Spring JUnit Rules的最大机会是易于创建参数化的集…

不属于python的数据类型_下列________不是Python的数据类型。

【判断题】已知 x, y 3, 5,那么执行x, y y, x 之后,x的值为15。【多选题】Python 中对变量描述正确的选项是( )【单选题】字符串是一个连续的字符序列,用________方式打印出可以换行的字符串。【多选题】以下选项中,不符合 Python 语言变量命名规则的有( )【多选题】Python的…

无处不在_Java无处不在:使用DukeScript在任何地方运行一次编写

无处不在在相当长一段时间内,Java都未能兑现“一次编写,随处运行”的承诺。 DukeScript希望通过在跨平台应用程序中实现视图和逻辑的清晰分离来改变这种状况。 在本文中,一个简单的场景用于介绍DukeScript的基础。 多年以来,Java…

C语言为何不会过时

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删评价任何一门编程语言,都是招人骂的。永远是这样。就像是春寒料峭的季节, 街上穿棉袄和穿单衣的擦肩而过,双方…

下列选项中不属于python循环语句的是哪一项_下列选项中,不属于字典操作的方法是哪一项?_学小易找答案...

【简答题】字符串有哪几种表现形式?【简答题】简述Python程序的执行过程。【单选题】Python 语句x‘char’;y2,print(xy)输出的结果是哪一项?()【编程题】输入三角形的边长和高,计算并输出三角形的面积。【简答题】手机插上充电器却没有显示充电,可以用万用表检测吗?请上网搜…

mysql 死锁监视器_并发基础知识:死锁和对象监视器

mysql 死锁监视器本文是我们名为Java Concurrency Essentials的学院课程的一部分。 在本课程中,您将深入探讨并发的魔力。 将向您介绍并发和并发代码的基础知识,并学习诸如原子性,同步和线程安全性的概念。 在这里查看 ! 目录 …

python ks值计算_利用Python计算KS的实例详解

在金融领域中,我们的y值和预测得到的违约概率刚好是两个分布未知的两个分布。好的信用风控模型一般从准确性、稳定性和可解释性来评估模型。sOf免费资源网一般来说。好人样本的分布同坏人样本的分布应该是有很大不同的,KS正好是有效性指标中的区分能力指…

教你如何用一句话激怒IT人

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删在IT行业摸爬滚打这么久,你是否听过下面这些话:“这个很简单,我也是做程序出身的。”“预算砍掉一半&#xf…

java的网络编程有用吗_十大有用但又偏执的Java编程技术

java的网络编程有用吗经过一段时间的编码(以我为例,大约20年左右,当您玩得开心时光飞逝),人们开始接受这些习惯。 因为,你知道... 任何可能出错的事情都会发生。 这就是为什么人们会采用“防御性编程”的原…

python bootstrap 4_Python3.4+Django1.9+Bootstrap3

实现和原理Python集成Django开发框架后,可以通过在cmd命令提示符下建立工程,工程名为learn_modelsdjango-admin.py startproject learn_models再进入到learn_models里面,新建一个app项目cd learn_modelspython manage.py startapp learn此时目…

未来五年有颠覆性的IT技术都在这里

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删据福布斯杂志报道,在美国奥兰多举行的Gartner研讨会上,市场研究机构Gartner Research的副总裁兼资深研究员大卫卡利&…

java ee maven_真正释放Maven和Java EE的强大功能

java ee maven如果野心和愿景太复杂而无法使用,则它们可能会淘汰伟大的解决方案。 尽管Maven和Java EE是在整个Java行业中都已建立的良好技术,但是使用它们并使用其作者打算使用的所有技术和模式来设计项目可能非常棘手。 在开发过程中途,由…

python字符串解释_python基础之字符串详解

1、Python环境配置:下载好之后安装,注意勾选环境变量。2、写python一定要注意代码的缩进。2、字符串:(1)、字符串是从左到右是从0开始索引,从右到左是从-1开始。遵循包前不包后原则。举例说明:代码: …

程序员们,想在双十一脱单?赶快跟我捯饬起来吧

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删生活中有很多男人一边抱怨自己不够洋气,找不到女票,另一方面又懒到宁肯在床上撸啊撸,也不愿意好好打扮自己。…

jboss8日志级别设置_罐中研讨会:设置JBoss BRMS全日研讨会

jboss8日志级别设置是否在寻找一种简单的方法来宣传,展示或演示使用JBoss业务规则管理系统(BRMS)产品的入门难度? 别无所求,因为我们已经召集了这个研讨会,因此您可以围绕JBoss BRMS构建一个晚上&#xff…

python具有伪代码的本质吗_Python的优点之一是具有伪代码的本质。( )_学小易找答案...

【单选题】下面关于函数的说法,错误的是( )。【单选题】实际开发中,文件或者文件夹操作都要用到os模块。( )【单选题】函数能处理比声明时更多的参数,它们是( ) 参数。【单选题】函数的名称可以随意命名。( )【单选题】Python源代码被解释器转换后的格式为( )。【单选题】Pytho…

C语言编程时你常犯的18种错误

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删C语言的最大特点是:功能强、使用方便灵活。C编译的程序对语法检查并不象其它高级语言那么严格,这就给编程人员留下“灵活…