2017-09-26 64 views
0

我在嘗試構建一個Azure函數,該函數會傳出大量HTTP請求。定期它似乎達到了極限,所有的請求超時幾分鐘。然後它再次開始工作並請求通過。Azure功能 - 節點應用程序中的端口耗盡

從四周搜索,這聽起來像這可能是由於運行該功能的機器上的端口耗盡,但我不明白如何調試此問題或使用request庫在Node應用程序中解決此問題。這聽起來像是Node應該聯合連接來防止這種情況發生。我並不確定端口耗盡是問題所在,因爲我不能在該功能上使用netstat。我從來沒有在筆記本電腦上運行過任何問題。

這裏有一個簡單的Azure的功能將觸發大量的請求,一次一個,並說明了這個問題:

const cp = require('child_process'); 
const request = require('request'); 

module.exports = function (context, myTimer) { 
    context.log('Starting'); 

    function doCall(cb) { 
     const url = 'https://jsonplaceholder.typicode.com/posts'; 
     request(url, (err) => { 
      if (err) { 
       context.log("error: " + err.toString()); 
      } 

      cb(); 
     }); 
    } 

    let i = 500; 
    doCall(function iterate() { 
     if (i-- > 0) { 
      context.log('iterate ' + i); 
      doCall(iterate); 
     } else { 
      context.log('done'); 
      context.done(); 
     } 
    }); 
}; 

我看到它成功運行,超時一兩分鐘,再次成功運行..

+0

也許減少了水池邊會有所幫助。不是超級熟悉Node,但看到是在https://stackoverflow.com/questions/19043355/how-to-use-request-js-node-js-module-pools是有幫助的。 –

回答

0

@ david-ebbo,你的建議非常有幫助。從您發佈的鏈接中,我可以使用http代理來限制套接字池。運行需要一段時間,但現在沒有請求超時。

我從上面例子現在看起來是這樣的:

const cp = require('child_process'); 
const request = require('request'); 
const http = require('http'); 

module.exports = function (context, myTimer) { 
    context.log('Starting with agent'); 
    const pool = new http.Agent(); 
    pool.maxSockets = 4; 

    function doCall(cb) { 
     const url = 'https://jsonplaceholder.typicode.com/posts'; 
     request({ url, pool }, (err) => { 
      if (err) { 
       context.log("error: " + err.toString()); 
      } 

      cb(); 
     }); 
    } 

    let i = 500; 
    doCall(function iterate() { 
     if (i-- > 0) { 
      context.log('iterate ' + i); 
      doCall(iterate); 
     } else { 
      context.log('done'); 
      context.done(); 
     } 
    }); 
}; 
相關問題