位置: 编程技术 - 正文

浅谈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)

  • 营业外收入要交企业所得税吗
  • 非营利组织企业所得税
  • 交易性金融资产的交易费用计入哪里
  • 免交城建税的会计分录
  • 暂估资产会计处理
  • 无形资产摊销年限
  • 工程项目的存货含哪些科目
  • 外商独资企业资本金的使用
  • 事业基金转入哪个科目
  • 税务风险有哪些
  • 融资贷款保险费计算公式
  • 取得转账支票后该如何处理
  • 补缴的公积金可以抵扣个税吗
  • 开发票时怎么修改税收分类简称?
  • 税收分类编码里的劳务是劳务派遣的意思吗
  • 回扣费可以税前扣除吗?
  • 商铺 公司
  • 专用发票过期了还能冲红发票吗
  • 预付账款和其他应收款可以抵消吗
  • 抽奖获得的奖品有权转卖吗
  • 代缴个税税务局奖励款怎么做账?
  • 国税地税纳税申报
  • 暂估入账的处理
  • 苹果电脑mac设备在哪里
  • 行政单位上年支出退回
  • 什么是租赁公司的主营业务
  • 如何做无票收入的会计分录
  • 以前年度应收账款错误如何调整
  • 在建工程转固定资产后如何计提折旧
  • 细说php
  • 股东分红缴纳个税时间
  • 哪些情形不属于伪现金
  • 办理发票缴销需要提供的资料
  • 手机客户端app使用
  • php知识总结
  • 贷款核销对个人的影响
  • php使用什么开发工具
  • php新版本特性
  • 发放工资时扣除的保险怎么做
  • 深度学习:图像去雨网络实现Pytorch (二)一个简单实用的基准模型(PreNet)实现
  • php 文件目录
  • 代销手续费的税率
  • 从网上学电脑下载什么软件
  • mysql数据库死锁产生的原因及解决方案
  • 所得税报表的营业成本包括费用吗
  • 矿泉水发票能否抵税
  • 小规模教育培训怎样纳税
  • 行政单位要不要税号?
  • 一般纳税人适用3%税率情况
  • 用于捐赠的会计处理
  • 销售货款未收到会计分录
  • 小企业汇算清缴补税会计分录
  • 税务监制章验证无效
  • 无偿赠送他人产品,会计分录怎么写
  • 2021年财务新规定
  • 购买材料发生商损怎么算
  • 暂估成本以后也没有票回来了
  • 带息票据与不带息票据
  • 企业注销前是不是资产必须处理完
  • 业务招待费管理草案探讨
  • mysql mac启动
  • ntldr.exe - ntldr
  • wwSecure.exe - wwSecure是什么进程
  • 膈肌窝里有痦子
  • windows8.1开始
  • window10 360
  • 自动切换桌面
  • windows8应用商店在哪
  • jquery网页设计
  • node 全局安装
  • bat批处理脚本教程
  • css网站布局实录 pdf
  • 怎么用python画图具体步骤
  • pull order
  • js拖拽效果
  • unityugui优化
  • javascript document.execCommand() 常用解析
  • 个人所得税预扣预缴办法
  • 逾期未申报扣几分
  • 什么是美国注册公司
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设