【问题标题】:nodejs, control over concurrent connectionsnodejs,控制并发连接
【发布时间】:2015-06-03 00:09:52
【问题描述】:

我正在使用 nodejs 异步模块进行并发连接,现在我的后端服务器一次只能处理 1000 个连接,我正在使用 async.mapLimit 来限制连接,async.mapLimit 的每个作业都会执行多个连接,当我正在从多个浏览器同时发送执行 async.mapLimit 的相同请求,然后我从服务器端收到 EMFILE 错误

([Error: connect EMFILE] code: 'EMFILE', errno: 'EMFILE', syscall: 'connect'), 

我的代码有点像这样:

async.mapLimit(jobList, 200, jobCallback, function(error, data) {
});

function jobCallback(job, callback) {
    /* Make multiple connections to to backend server, this number is 
       dynamic, here also I use async.mapLimit */
}

现在我想在这个 mapLimit 或任何东西的顶部实现一些包装函数,不管并行请求的数量如何,我想限制并发连接,即使也不管客户端调用的数量,它可能会更慢,但我愿意不打扰。

我怎样才能做到这一点?

我正在使用 restler 库。我试过设置

proto.globalAgent.maxSockets = 1000

一次做 1000 个并发连接,但它似乎不起作用。 请指教。

-M-

【问题讨论】:

    标签: node.js asynchronous concurrency


    【解决方案1】:

    您必须控制自己的节流,因为该异步指令不会知道您是否有来自其他用户的呼叫增加了 1000 限制。

    在 REST 服务中,服务通常会在触发此类限制时发送 http 429 响应,从而允许您的应用识别瓶颈场景并触发限制机制。

    一种常见的方法是通过指数退避 https://developers.google.com/api-client-library/java/google-http-java-client/backoff

    【讨论】:

      【解决方案2】:

      我使用以下代码行来全局管理限制:

      require('events').EventEmitter.prototype._maxListeners = 1000;
      

      谢谢

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多