2017-09-26 67 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(); 
     } 
    }); 
}; 
相关问题