代码之家  ›  专栏  ›  技术社区  ›  Rob Lourens

Azure功能-节点应用中的端口耗尽

  •  1
  • Rob Lourens  · 技术社区  · 8 年前

    我正在尝试构建一个Azure函数,它可以发出大量传出HTTP请求。它似乎周期性地达到极限,所有请求都会超时几分钟。然后它再次开始工作,请求通过。

    通过四处搜索,听起来这可能是由于运行该功能的机器上的端口耗尽,但我不知道如何调试或在使用 request 图书馆听起来,节点应该共享连接来防止这种情况。我根本不确定端口耗尽是不是问题,因为我不能使用 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();
            }
        });
    };
    

    1 回复  |  直到 8 年前
        1
  •  0
  •   nelak Rob Lourens    8 年前

    @大卫·艾博,你的建议很有帮助。从您发布的链接中,我可以使用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();
            }
        });
    };