簡體   English   中英

Node.js出站http請求並發

[英]Node.js outbound http request concurrency

我有一個node.js腳本,它從外部Web API中提取數據以進行本地存儲。 第一個請求是一個查詢,它返回我需要獲取更多信息的ID列表。 對於返回的每個ID,我從node.js生成一個新的http請求,並向服務器伸出數據(POST請求)。 一旦工作完成,我睡了3分鍾,然后重復。 有時,ID的數量是數百個。 對於那些返回的每個單獨的http請求可能是1kb的數據,通常更少,因此往返非常短。

今天早上我從API提供商處收到一封電子郵件,請求我關閉我的流程,因為我“占用了所有具有數百個連接的API服務器”(我實在為此感到非常自豪,但這不是重點)。 為了好,我將睡眠從3分鍾增加到30分鍾,這迄今為止幫助了他們

關於問題...現在我沒有設置maxSockets或任何東西,所以我認為默認值是5.這不是說這意味着我一次只能創建5個實時http請求連接嗎? 管理員有幾百個? 數據傳送后,他們的服務器是否掛斷了連接? 我沒有這樣做嗎? 我的http請求結束時沒有明確的斷開連接,所以也許我在這里有錯。 那么maxSockets實際上設置了什么?

很抱歉由於某種原因,我沒有正確地閱讀您的問題

maxSockets是http模塊為當前進程創建的最大連接數。 您可以通過從http.globalAgent.maxSockets訪問它來查看您當前設置的http.globalAgent.maxSockets

您可以通過以下方式查看有關給定主機的當前連接數的一些信息:

console.log("Active socket connections: %d", http.globalAgent.sockets['localhost:8080'].length )
console.log("Total queued requests: %d", http.globalAgent.requests['localhost:8080'].length)

localhost:8080替換為您正在提出請求的主機和端口。

您可以在以下兩點看到節點如何處理這些連接:

添加新連接並存儲到請求隊列

https://github.com/joyent/node/blob/master/lib/_http_agent.js#L83

從排隊的請求創建連接

https://github.com/joyent/node/blob/master/lib/_http_agent.js#L148


我很快就寫了這篇文章,讓你知道如何將這些請求錯開一些。 這個特殊的代碼不會檢查有多少請求是“待定”的,您可以輕松修改它以允許您在任何給定時間只有一定數量的請求發出(實際上這是更好的方法) 。

var Stagger = function (data, stagger, fn, cb) {

    var self        = this;
    this.timerID    = 0;
    this.data       = [].concat(data);
    this.fn         = fn;
    this.cb         = cb;
    this.stagger    = stagger;
    this.iteration  = 0;
    this.store      = {};

    this.start = function () {
        (function __stagger() {

            self.fn(self.iteration, self.data[self.iteration], self.store);

            self.iteration++;

            if (self.iteration != self.data.length)
                self.timerID = setTimeout(__stagger, self.stagger);
            else
                cb(self.store);

        })();
    };

    this.stop = function () {
        clearTimeout(self.timerID);

    };
};


var t = new Stagger([1,2,3,4,5,6], 1000, function (i, item, store) {
    console.log(i, item);
    if (!store.out) store.out = [];

    store.out[i] = Math.pow(2,i);
},
function (store) {
    console.log('Done!', store);
});

t.start();

這個代碼肯定可以改進,但它應該讓你知道從哪里開始。

現場演示: http//jsbin.com/ewoyik/1/edit (注:需要控制台)

暫無
暫無

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

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