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校准油门

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

  1. 服务器禁止head 请求_编写下载服务器。 第四部分:有效地执行HEAD操作

    服务器禁止head 请求 HEAD是一个经常被遗忘的HTTP方法(动词),其行为类似于GET,但不返回正文. 您使用HEAD来检查资源的存在(如果不存在,它应该返回404),并确保您的缓存中没有陈旧的 ...

  2. 服务器编写_编写下载服务器。 第六部分:描述您发送的内容(内容类型等)...

    服务器编写 就HTTP而言,客户端下载的只是一堆字节. 但是,客户真的很想知道如何解释这些字节. 它是图像吗? 还是ZIP文件? 本系列的最后一部分描述了如何向客户端提示她下载的内容. 设置 内容类型 ...

  3. 502无法解析服务器标头_编写下载服务器。 第三部分:标头:内容长度和范围...

    502无法解析服务器标头 这次,我们将探索更多HTTP请求和响应标头,以改善下载服务器的实现: Content-length和Range . 前者表示下载量很大,后者允许部分下载文件,或者从我们开始的 ...

  4. grpc 流式传输_编写下载服务器。 第一部分:始终流式传输,永远不要完全保留在内存中...

    grpc 流式传输 下载各种文件(文本或二进制文件)是每个企业应用程序的生死攸关的事情. PDF文档,附件,媒体,可执行文件,CSV,超大文件等.几乎每个应用程序迟早都必须提供某种形式的下载. 下载是 ...

  5. 502无法解析服务器标头_编写下载服务器。 第二部分:标头:Last-Modified,ETag和If-None-Match...

    502无法解析服务器标头 客户端缓存是万维网的基础之一. 服务器应通知客户端资源的有效性,客户端应尽可能快地对其进行缓存. 如我们所见,如果不缓存Web,它将非常缓慢. 只需在任何网站上Ctrl + ...

  6. 编写下载服务器。 第五部分:油门下载速度

    在僵尸网络时代,您可以租用几百美元来运行自己的分布式拒绝服务攻击,拥有紧急开关有选择地关闭昂贵的功能或极大地降低性能是一个巨大的胜利. 在缓解问题的同时,您的应用程序仍可运行. 当然,这种安全措施在高 ...

  7. 编写下载服务器。 第四部分:有效地实现HEAD操作

    HEAD是一个经常被遗忘的HTTP方法(动词),其行为类似于GET,但不会返回正文. 您使用HEAD来检查资源的存在(如果不存在,它应该返回404),并确保您的缓存中没有陈旧的版本. 在这种情况下,您 ...

  8. 编写下载服务器。 第一部分:始终流式传输,永远不要完全保留在内存中

    下载各种文件(文本或二进制文件)是每个企业应用程序的生死攸关的事情. PDF文档,附件,媒体,可执行文件,CSV,超大文件等.几乎每个应用程序迟早都必须提供某种形式的下载. 下载是通过HTTP来实现的 ...

  9. 编写下载服务器。 第二部分:标头:Last-Modified,ETag和If-None-Match

    客户端缓存是万维网的基础之一. 服务器应告知客户端资源的有效性,客户端应尽可能快地对其进行缓存. 如我们所见,如果不缓存Web,将会非常慢. 只需在任何网站上Ctrl + F5并将其与普通F5进行比较 ...

最新文章

  1. 机房收费系统总结【3】-数据库细节
  2. Wireshark网络抓包(四)——工具
  3. 逆向-002-iOS重签名
  4. java 事件通知_正确获取Java事件通知
  5. 前端学习(2101):javascript高阶函数得使用
  6. 4.聚合aggregate
  7. hdu 2586 How far away ?(LCA模板)(倍增法)
  8. hide your website's wordpress info/path/way
  9. solaris查看服务器信息,Solaris下如何显示服务器虚拟内存统计信息
  10. Android之解决太大太多图片造成的oom
  11. c语言链表二路归并排序,链表的二路归并排序 Sort List
  12. MySQL多表-笔记
  13. Dism++: 好用的Windows 系统优化工具
  14. 大二上,计组原理笔记(2)2.2 机器数的定浮点表示
  15. Java的LockSupport.park()实现分析(转载)
  16. vue中实现文字超过2行... 展开-收起(兼容ie)
  17. 虚拟地址 虚拟内存 物理地址
  18. 【项目】Thinkphp5.1制作博客CMS
  19. 台湾国立大学郭彦甫Matlab教程笔记(1)schedule
  20. matlab计算后输出结果是分式(不是小数)

热门文章

  1. P5445-[APIO2019]路灯【set,树状数组套线段树】
  2. nssl1467-U【差分】
  3. 背包例题の01,完全,多重
  4. 实践出真知之Spring Cloud之基于Eureka、Ribbon、Feign的真实案例
  5. JFreeChart(八)之时序图
  6. 金融系统中正确的金额计算及存储方式
  7. java、sqlserver复习
  8. == 和 equals() 区别
  9. android之微信分享音频
  10. mysql group和order_mysql 用 group by 和 order by同时使用