简化Node.js服务器的速率限制算法

亚历山大·米尔斯

我为Node.js服务器的速率限制算法提出了一个幼稚的解决方案,我相信有一种方法可以简化它,但是我不确定怎么做。

我们希望将请求限制为每秒50个。因此,如果有最新请求,并且新请求与返回50个请求之间的时间少于一秒钟,则我们应拒绝新请求。

幼稚的实现方式是拥有一个包含50个时间戳的简单数组。每次发生事件时,我们都会为它分配一个Date.now()/ process.hrtime()值。然后,我们查看队列中第50个(最后一个)时间戳的时间戳值和新请求的Date.now()值,如果时间戳的差大于1秒,则我们接受新请求并将其取消移位“队列”,然后从队列中弹出最早的时间戳。但是,如果差异小于1秒,则必须拒绝该请求,并且不将其移到队列中,也不会弹出最早的时间戳。

这是我在Express服务器上的代码

var mostRecentRequestsTimestamps = [];

app.use(function(req,res,next){

    if(req.baymaxSource && String(req.baymaxSource).toUpperCase() === 'XRE'){

        var now = process.hrtime(); //nanoseconds

        if(mostRecentRequestsTimestamps.length < 50){
            mostRecentRequestsTimestamps.unshift(now);
            next();
        }
        else{
            var lastItem = mostRecentRequestsTimestamps.length -1;
            if(now - mostRecentRequestsTimestamps[lastItem] < 1000){  // 1000 milliseconds = 1 second
                res.status(503).json({error: 'Server overwhelmed by XRE events'});
            }
            else{
                mostRecentRequestsTimestamps.pop();
                mostRecentRequestsTimestamps.unshift(now);
                next();
            }
        }
    }
    else{
        next();
    }

});

如您所见,它仅在事件来自某个特定来源的情况下才阻止它们,因此它不应饿死其他类型的请求。此逻辑需要50个时间戳的数据结构,基本上没有任何内容,但我希望有可能的话进一步简化它。有人有想法么?谢谢

jfriend00

这是我最简单的方法:

// oldest request time is at front of the array
var recentRequestTimes = [];
var maxRequests = 50;
var maxRequestsTime = 1000;

app.use(function(req,res,next){
    if(req.baymaxSource && String(req.baymaxSource).toUpperCase() === 'XRE'){
        var old, now = Date.now();
        recentRequestTimes.push(now);
        if (recentRequestTimes.length >= maxRequests) {
            // get the oldest request time and examine it
            old = recentRequestTimes.shift();
            if (now - old <= maxRequestsTime) {
                // old request was not very long ago, too many coming in during that maxRequestsTime
                res.status(503).json({error: 'Exceeded 50 requests per second for XRE events'});
                return;
            }
        }
    }
    next();
});

这在概念上与您的实现在两个方面不同:

  1. recentRequestTimes以递增的顺序使用数组(对我的编程大脑而言,这在逻辑上要有意义得多)
  2. 我总是将每个请求添加到数组,即使它超载也是如此。您没有在计算超出过载的请求,我认为这是错误的。这也简化了代码,因为您只需将当前时间添加到函数开始处的某个位置,然后再处理数组即可。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Javascript Node.js简化IF ELSE

来自分类Dev

创建架构猫鼬模型(Node.js)以简化代码

来自分类Dev

如何限制对node.js服务器的直接访问

来自分类Dev

Node.js HTTP服务器

来自分类Dev

Node.js状态服务器

来自分类Dev

如何创建Node JS服务器

来自分类Dev

Node.js HTTP服务器

来自分类Dev

调用node.js服务器

来自分类Dev

崩溃服务器 node.js

来自分类Dev

算法简化

来自分类Dev

如何使用 async.js 简化 Node.js 中的回调代码

来自分类Dev

速率限制-TCP服务器(net.Server)

来自分类Dev

Rserve 内置的 HTTP 服务器中的速率限制?

来自分类Dev

HAPI JS Node js创建https服务器

来自分类Dev

从Node JS connect.js获取服务器的端口

来自分类Dev

Node.js“服务器”与Nginx或Apache服务器相比如何?

来自分类Dev

通过IIS部署Node.js服务器-如何运行服务器?

来自分类Dev

如何在在线服务器上启动Node JS服务器?

来自分类Dev

将node.js服务器更改为Apache服务器

来自分类Dev

无法访问 Web 服务器上的 Node.js 服务器

来自分类Dev

如何获取运行node.js的服务器名称?

来自分类Dev

Node.js服务器启动和停止

来自分类Dev

主要映像难题-Node.js Express服务器

来自分类Dev

启动node.js服务器时Ansible挂起

来自分类Dev

设置Node JS服务器的用户代理

来自分类Dev

在Heroku上设置Node.js服务器的端口

来自分类Dev

Node.js-服务器关闭了连接?

来自分类Dev

Node.js服务器(移动客户端)

来自分类Dev

node.js中的Web服务器路径错误