位置: 编程技术 - 正文

浅谈Koa服务限流方法实践(服务器限制流量)

编辑:rootadmin

推荐整理分享浅谈Koa服务限流方法实践(服务器限制流量),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:如何实现服务限流,限制端口流量,如何实现服务限流,服务端限流,如何实现服务限流,如何实现服务限流,服务器限流,服务端限流,内容如对您有帮助,希望把文章链接给更多的朋友!

最近接了一个需求,很简单,就是起一个server,收到请求时调用某个提供好的接口,然后把结果返回。因为这个接口的性能问题,同时在请求的不能超过特定数目,要在服务中进行限流。

限流的要求是,限制同时执行的数目,超出这个数目后要在一个队列中进行缓存。

koa 中间件不调用 next

最初的想法是在 koa 中间件中进行计数,超过6个时将next函数缓存下来。等正在进行中的任务结束时,调用next继续其他请求。

之后发现 koa 中间件中,不执行next函数请求并不会停下,而是不再调用之后的中间件,直接返回内容。

以上代码首先在控制台打出 ‘middleware 1' => 浏览器收到 ‘hello' => 控制台打出 ‘middleware 2'。

这里还有一个要注意的地方,就是一个请求已经结束(finish)后,他的next方法还是可以继续调用,之后的middleware还是继续运行的(但是对ctx的修改不会生效,因为请求已经返回了)。同样,关闭的请求(close)也是同样的表现。

使用 await 让请求进行等待

延迟next函数执行不能达到目的。接下来自然想到的就是使用await让当前请求等待。await的函数返回一个Promise,我们将这个Promise中的resolve函数存储到队列中,延迟调用。

上面这段代码,在delay函数中返回一个Promise,Promise的resolve函数存入队列中。设置定时3s后执行队列中的resolve函数,使请求继续执行。

针对路由进行限流,还是针对请求进行限流?

限流的基本原理实现后,下面一个问题就是限流代码该写在哪里?基本上,有两个位置:

浅谈Koa服务限流方法实践(服务器限制流量)

针对接口进行限流

由于我们的需求中,限流是因为要请求接口的性能有限。所以我们可以单独针对这个请求进行限流:

下面还有一个方便复用的版本。

针对路由进行限流

这种方式是写一个koa中间件,在中间件中进行限流:

之后针对不同路由在router中使用这个中间件就好了:

比较

实现了针对接口进行限流,觉得逻辑有些乱,于是改用了针对路由进行限流,一切运行的很完美。

直到我又接了个需求,是要请求三次这个接口返回三次请求的结果数组。现在问题来了,我们不能直接调用接口,因为要限流。也不能直接调用请求接口的函数因为我们的限流是以路由为单位的。那怎么办呢?我们只有请求这个路由了,自己请求自己。。。

需要注意的地方

监听close事件,将请求从队列中移出已经存储在队列中的请求,有可能遇到用户取消的情况。前面说过koa中即使请求取消,之后的中间件还是会运行,也就是还会执行需要限流的接口,造成浪费。

可以监听close事件来达到这个目的,每个请求我们需要用hash值来标记:

设置超时时间

为了防止用户等待过长时间,需要设置超时时间,这在koa中很容易实现:

当前队列已经过长

如果当前队列已经过长了,即使加入队列中也会超时。因此我们还需要处理队列过长的情况:

标签: 服务器限制流量

本文链接地址:https://www.jiuchutong.com/biancheng/379473.html 转载请保留说明!

上一篇:node文件批量重命名的方法示例(nodejs重命名文件)

下一篇:nodejs中安装ghost出错的原因及解决方法(nodejs ghost)

  • 累进税率的税种有哪些
  • 收到失业保险稳岗补贴会计分录
  • 分公司可以独立开银行账户吗
  • 印花税多报了几块钱税务局会找我吗
  • 车船税在备注栏怎么报表
  • 小企业会计准则和企业会计准则的区别
  • 关税如何征收
  • 给客户现金回款怎么写
  • 净现值为什么要除以它的折现率
  • 提供境外服务
  • 7月1日前购进的农产品如何抵扣
  • 员工福利费是否计入赔偿
  • 技术维护费属于劳务还是研发和技术服务
  • 收到财付通打款认证冲减财务费用怎么做分录
  • 应收账款账龄怎么查
  • 工资必须通过银行代发吗
  • 一般纳税人有进项无销项
  • 企业未成立工会需要交工会经费吗
  • 数量和单价的乘积
  • win10 100g不够
  • 跨年的暂估成本怎么冲回
  • 华为分享是什么意思关闭有影响吗
  • win10 0×0000007b怎么解决
  • 固定资产账面价值在什么情况下会出现负值
  • 增资后持股比例怎么算
  • realjbox.exe - realjbox是什么进程 作用是什么
  • u深度u盘启动盘制作工具官网
  • 艾叶泡脚的方法和注意事项
  • PHP:curl_share_setopt()的用法_cURL函数
  • win10开机强制进入高级选项怎么退出
  • 废旧物资销售收入
  • 公司为员工交的社保比例
  • 其他应付款转资本公积股东决议
  • 稳岗补贴需要缴纳什么税
  • 涨点是什么意思
  • php自定义header
  • 时间序列转换
  • jsoup js
  • afn取消请求
  • PyTorch 深度学习实战 | 基于生成式对抗网络生成动漫人物
  • AIGC之GPT-4:GPT-4的简介(核心原理/意义/亮点/技术点/缺点/使用建议)、使用方法、案例应用(计算能力/代码能力/看图能力等)之详细攻略
  • php读取文件内容
  • javascrapt
  • 个税在工资里怎么计提
  • 预收安装费的会计分录
  • 上个月的留底税这个使用,会计分录
  • 企业收到财政补贴如何开票
  • 事业结余期末余额在借方
  • 税收分类口诀
  • 采用工作底稿法编制现金流量表是以工作底稿为
  • 财政拨款结余明细科目编码
  • 律师跨省办案收取的费用叫什么
  • 开具利息收入发票需不需要有经营范围
  • 利润表中的利息费用是利息支出吗
  • 什么情况下增值税计入成本
  • 子公司内部交易
  • 对公账户是不是哪个银行都可以
  • 收到同业清算互联前置如何入账
  • 企业净资产怎么填
  • 物流运输公司的运营盈利模式
  • sql语句重复
  • mac系统的控制面板在哪
  • CentOS操作系统
  • keyemain.exe是什么
  • 系统导航栏已禁用怎么办
  • win7升级到win10专业版教程
  • cocos2dx3.4 Label
  • 单线程语言有哪些
  • 环境篇作文
  • shell printf 变量
  • cocos2dx官方教程
  • nodejs游戏开发
  • shell脚本实现自动部署
  • dos命令中运行文件的命令
  • css 定位
  • 获取已安装应用列表的权限在哪里设置
  • div-d和div-i
  • fragment生命周期图
  • 深圳市税务局好考吗
  • 怎么打印纳税申报表带章的
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设