nodejs,控制并发连接

时间:2015-03-30 04:24:53

标签: node.js asynchronous concurrency

我正在使用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 -

2 个答案:

答案 0 :(得分:0)

你必须自己控制限制,因为async指令不知道你是否有来自其他用户的电话增加到1000限制。

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

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

答案 1 :(得分:0)

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

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

由于