一、为什么要限速?

  • 通常在使用各类网盘工具或者在网站下载较大的文件时都会遇到限流的问题。打个比方,用户从宽带运营商那里所购买的实际宽带是 100 Mb/s,但在下载文件的过程中,下载速度却只能达到 10 Mb/s 或者更低,这种情况就可以认定为服务端或客户端做了限速处理。
  • 站在客户的角度上讲,限速确实是个令人反感的机制,下载速度慢,一个文件经常要下载很久,虽然办理了高速宽带却享受不到高速的下载,服务提供商也清楚限速会引起客户反感,那为什么还要额外增加这一层限制?其实服务器限流的原因有很多,最常见的便是以下几种原因:
    • 保护服务器:服务器处理大量请求可能会导致服务器过载,影响服务器的性能和稳定性,限流可以确保服务器运行于合理的负载范围内,从而保障服务的总体可用性;
    • 平衡流量:限流可以平衡服务器的流量,防止个别用户占用过多的带宽,而导致其他用户请求无法得到合理响应的情况。
    • 出于商业考虑:对普通用户限速是为了向付费用户提供更高的带宽、更快的下载速度,保障付费用户的体验。

二、常见的限速方式

  • 常见的限速方式大致分为 2 种:客户端限速和服务端限速:
    • 客户端(前端)限速:是指在服务器和客户端之间进行流量控制,即限制客户端发起请求时的数据传输速率,常见的前端限速方式包括:带宽限制、IP 地址限制、端口限制、应用程序限制等,前端限速通常在网络层面进行,通过限制客户端请求的速率来控制整个网络的流量;
    • 服务端(后端)限速:是指在服务器处理请求时进行流量控制,即限制服务器响应客户端请求的数据传输速率,常见的后端限速方式包括:下载速度限制、下载配额限制、下载时间限制、IP 地址限制等,后端限速通常在应用程序层面进行,通过限制服务器响应请求的速率来控制服务器的流量和负载。
  • 而后端限速相对于前端限速更加有效和安全,后端限速更难被绕过,可以限制整个服务的全局访问速率,更容易集中管理和监控。相比之下,前端限速只能影响单个客户端,需要在每个客户端上执行,并且可能需要更新客户端代码,使得管理和监控限速措施更加复杂。当然在某些情况下,前端限速也可能是必要的措施。

三、常用的后端限速算法

  • 常用的后端限速算法:
    • 令牌桶算法:基于令牌桶的思想来限制流量,通过限制每个请求从令牌桶中获取令牌的速率来实现限速。
    • 漏桶算法:基于漏桶的思想来限制流量,通过漏桶来限制请求发送的速率。
    • 固定窗口算法:通过固定的时间窗口来限制请求的发送速率。
    • 滑动窗口算法:通过滑动窗口来限制请求的发送速率,允许在每个窗口内的请求速率不超过指定的速率。
  • 看到算法,可能有不少开发者可能都觉得有些压力,如何实现它以及实现后是否稳定,这都会成为在开发过程中遇到的问题。而 EdgerOS 为了解决开发者这样的苦恼,为了让开发者更加专注于业务与功能上的实现,在 JSRE 引擎 1.10.0 版本 中增加了 Throttle 限流模块,开发者可以轻松的通过该模块进行流控限制。

四、Throttle 模块实现原理

  • 在 EdgerOS 开发过程中我们可以通过 Require() 方法导入 Stream 模块中的限流类 Throttle。
const Throttle = require('stream').Throttle
  • Throttle 类对象,可以限制数据流的速率从而保护后端服务,具体来说,Throttle 可以控制从另一个可读流中读取数据的速率,并且可以通过设置速率限制,确保不会超出规定的最大速率。这个实现非常重要,因为当有大量数据同时从一个服务中读取时,服务的性能可能会受到影响,因此限制数据流的速率可以确保服务始终可以保持良好的性能。
  • Throttle 类内部有一套完整的速率限制,具体来说,Throttle 使用了通过内部属性来存储速率限制和其他信息,类中包含了计时器、时间戳、速率等信息,以及从源可读流读取的数据。Throttle 通过源流的事件来判断,是否有数据可以读取,以及如何执行限速,在保证数据一致性的同时,也兼顾了快速相应的需求。

五、如何使用 Throttle 限速?

const Throttle = require('stream').Throttle// Create a stream that reads the specified file
var src = fs.createReadStream('./data.txt');// Create a stream with a read rate of 50 KBytes/s
var thr = new Throttle(src, { rate: 50 * 1024 });// Start time
var start = Date.now();// Read data from throttle readable stream
thr.on('data', () => {});
thr.on('end', () => {var cost = Date.now() - start;console.log('cost:', cost, 'ms');
});
  • EdgerOS 中所搭载的 JSRE 是一个立志降低开发者门槛的 Javascript 运行时,在不断的持续迭代中从 Device 模块,到 SyncTable 数据库,以及最新新增的 CloudHost 模块和 Throttle 模块。
  • 一直在将复杂的协议和业务场景做最精简的封装提供给开发者使用,使开发者可以将工作重心完全放在业务开发中,提高开发者的工作效率。随着 EdgerOS 以及 JSRE 日渐成熟,相信未来会有更多好用易用的功能模块出现在 EdgerOS 开发生态中。

爱智EdgerOS之深入解析后端流控大杀器Throttle相关推荐

  1. 爱智EdgerOS之深入解析离线下载任务

    一.需求分析 在日常使用计算机的过程中,看到喜欢的资源不可避免地想把它下载到我们的设备上保存下来,比如图片,音视频资源,文档资源等,基于这种应用场景,现在来看看在爱智设备上可以如何实现呢? 因为是离线 ...

  2. 爱智EdgerOS之深入解析文件和数据压缩模块ZIP与Zlib

    一."数据压缩"简介 数据压缩是采用某种压缩算法减少文件大小的一个过程,这个过程可能包括对源文件的编码.重组和修改等操作,该过程的主要目标是在减少文件大小的同时,确保源文件中的数据 ...

  3. 爱智EdgerOS之深入解析在爱智应用中如何使用Socket.IO轻松实现双向通信

    一.什么是 Socket.IO? Socket.IO 是一个基于事件通信的实时应用程序框架,它在即时通讯.通知和消息推送,实时分析等场景中有广泛的应用. Socket.IO 包括两个部分: 在 Ser ...

  4. Android 蓝牙 A2dp 听歌卡音?audio数据到a2dp通道流程解析----A2dp流控原理(Acl Flow Control),一文搞懂蓝牙卡音问题处理

    同学,别退出呀,我可是全网最牛逼的 Android 蓝牙分析博主,我写了上百篇蓝牙文章,请点击下面了解本专栏,进入本博主主页看看再走呗,一定不会让你后悔的,记得一定要去看主页置顶文章哦. 本文章将卡音 ...

  5. 硬解析优化_解析!解析!598元的山灵动圈耳机大杀器,横评对比心慌慌

    山灵自千元价位推出超值感三动铁耳机AE3之后,又很快在中端价位放出一款动圈耳机--ME80,目前官方售价598元. 下面谈谈: 包装如上,一如既往的精美和国际化. 看盒子上的图都能发现体积比曾经ME1 ...

  6. 重读经典:完全解析特征学习大杀器ResNet

    作者丨刘昕宸@知乎 来源丨https://zhuanlan.zhihu.com/p/268308900 编辑丨极市平台 论文标题:Deep Residual Learning for Image Re ...

  7. resnet过拟合_重读经典:完全解析特征学习大杀器ResNet

    公众号关注 "ML-CVer" 设为 "星标",DLCV消息即可送达! 作者丨刘昕宸@知乎来源丨https://zhuanlan.zhihu.com/p/268 ...

  8. 重读经典:完全解析特征学习大杀器 ResNet

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:作者丨刘昕宸@知乎 来源丨https://zhuanlan. ...

  9. Sentinel 发布里程碑版本,添加集群流控功能

    为什么80%的码农都做不了架构师?>>>    自去年10月底发布GA版本后,Sentinel在近期发布了另一个里程碑版本v1.4(最新的版本号是v1.4.1),加入了开发者关注的集 ...

最新文章

  1. Python库引用import多种用法及比较
  2. spring security只要熟悉每个filter的作用和顺序
  3. 活期储蓄账目管理系统
  4. 一文讲透,关于搭建指标体系,整理的重要知识点都在这里了
  5. 1304. 和为零的N个唯一整数
  6. ubuntu 重装 nvidia_时隔三个月 NVIDIA为何再次打破AI推理性能记录
  7. 一个简单的互斥量与条件变量例子
  8. 计算机拨珠游戏,拨算盘与算盘游戏 | 褚半农
  9. 【Golang】Go语言defer用法大总结(含return返回机制)
  10. mac 上安装selenium, phantomjs 和 chromedriver
  11. 苹果支付Java服务器实现
  12. 夏季养生:一觉,二瓜,三汤,四穴,五果
  13. error c2678解决方法
  14. 计算机毕设(附源码)JAVA-SSM基于Web美食网站设计
  15. 东郊到家预约系统开发流程
  16. 使用J-Link打印日志
  17. Solidworks快速装配——带配合装配与阵列装配(带例子解释)
  18. 无力吐槽的废酱的几个问题
  19. The Shawshank Redemption-2
  20. 浏览器中Vimium 插件快捷键

热门文章

  1. HTML大学生动漫网页设计作业源码 ~ 火影忍者动漫7页面带特效带轮播(HTML+CSS+JavaScript)...
  2. 让你的手机成为赚钱的机器,让你的手机无所不能。
  3. [数据结构] 常用的树型结构
  4. 易观推出面向初创企业的免费数据分析产品易观方舟Argo
  5. linux中 代表什么,Linux中的$1代表什么?
  6. 教你安装Y86-64模拟器(GUI界面)
  7. 网易新闻客户端(高仿)
  8. Excel如何利用函数将日期拆分为年月日三列显示
  9. 讯飞语音SDK集成调试常见问题
  10. 软件工程毕业设计 SSM勤工助学管理系统(源码+论文)