簡體   English   中英

Node.js請求循環限制

[英]Nodejs request loop limit

這是我的第一個nodejs應用程序。 我正在嘗試通過獲取一些外部API來進行cronjob並進行響應的一些計算。

一切正常,直到curlList變大為止。 在curlList中有10個項目是不錯的,但是我有一個很大的curlList超過90個項目。

什么是執行此實現的最佳方法。

感謝您的幫助。

最好的問候,約翰尼

var request = require('request');

var curlList = [{
    id: 1,
    href: '/name1'
}, {
    id: 2,
    href: '/name2'
}, {
    id: 3,
    href: '/name3'
}];

var curl = function(id, url) {
    var payload = {
        id: id
    };

    var options = {
        method: 'post',
        body: payload,
        json: true,
        url: ""
    }

    request(options, function(err, res, body) {
        if (err) {
            console.log(err, 'error posting json')
            return
        }
        //Calculate response data

        //If match 
        if (match) {
            console.log(url);
        }
    });
};

app.listen(3000, function() {

    for (var i = 0; i < curlList.length; i++) {
        var href = list[i].href;
        var id = list[i].id;
        curl(id, href);
    }

});

您的for循環會在幾微秒內啟動所有定義的請求-網站通常會檢測到諸如試圖使服務器超載( DoS攻擊)之類的干擾性行為。 由於您自己的硬件/網絡限制,這樣做也不是一個好主意-如果您需要發出1000個請求,而每個響應將有1 MB,則突然需要下載1 GB的響應數據。 更糟糕的是,您的網絡可能會過載,以至於某些請求只會超時。

您需要添加某種限制,以將在任何給定時間進行的請求數量限制為合理的數量。 我個人推薦async.js庫,尤其是它的eachLimit()實用程序。

修改您的代碼以執行以下操作;

var request = require('request');

var curlList = [{
    id: 1,
    href: '/name1'
}, {
    id: 2,
    href: '/name2'
}, {
    id: 3,
    href: '/name3'
}];

var curl = function(id, url, done) {
    var payload = {
        id: id
    };

    var options = {
        method: 'post',
        body: payload,
        json: true,
        url: ""
    }

    request(options, function(err, res, body) {
        done(err);

        if (err) {
            console.log(err, 'error posting json')
            return
        }
        //Calculate response data

        //If match
        if (match) {
            console.log(url);
        }
    });
};

app.listen(3000, function() {
    int current = 1;
    int max = 5; // max 5 parallel
    var scheduleJobs = function() {
        current--;
        while(current < max) {
            current++;
            var job = curList.shift();
            curl(job.id, job.href, scheduleJobs);
        }
    }
    scheduleJobs();
});

這最多允許5個並行請求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM