【问题标题】:Using Node cluster module with SailsJs: EADDRINUSE使用带有 SailsJs 的 Node 集群模块:EADDRINUSE
【发布时间】:2015-05-17 06:12:13
【问题描述】:

我有一个基于 SailsJs (http://sailsjs.org/) 的应用程序,它必须处理一些 CPU 密集型任务。简而言之,我想使用 cluster (https://nodejs.org/api/cluster.html) 模块将这些任务的处理委托给工作进程,这样 Sails 应用程序的主事件循环就不会被阻塞(因此可以正常响应请求)。

创建工作线程时,我收到 EADDRINUSE 错误,因为 Sails 正在尝试再次运行并绑定到同一端口。

示例代码:

// SomeSailsService.js

var cluster = require('cluster');
var Queue = require('bull');
var myQueue = Queue('myQueue', 'connection stuff', 'etc');
var numWorkers = 2;
var i;

if (cluster.isMaster) {
  // Spawn some workers
  for (i = 0; i < numWorkers; i++) {
    cluster.fork();
  }
} else {
  // This is a worker, so bind to new job event
  myQueue.process(function processJob(job, done) {
    // CPU intensive shenanigans
  });
}

module.exports = {
  addToQueue: function(foo) {
    myQueue.add({foo: foo});
  }
};

运行上述程序时,Sails 应用程序启动,然后在启动两个工作人员时尝试再启动应用程序两次。这会导致以下两个错误:

events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: bind EADDRINUSE
    at errnoException (net.js:904:11)
    at net.js:1084:30
    at Object.1:1 (cluster.js:594:5)
    at handleResponse (cluster.js:171:41)
    at respond (cluster.js:192:5)
    at handleMessage (cluster.js:202:5)
    at process.emit (events.js:117:20)
    at handleMessage (child_process.js:322:10)
    at child_process.js:396:7
    at process.handleConversion.net.Native.got (child_process.js:91:7)
    at process.<anonymous> (child_process.js:395:13)
    at process.emit (events.js:117:20)
    at handleMessage (child_process.js:322:10)
    at Pipe.channel.onread (child_process.js:347:11)

有没有办法解决这个问题?或者解决这个问题的替代方法?

【问题讨论】:

标签: node.js sails.js node-cluster


【解决方案1】:

我最终按照this blog post 的建议启动了应用程序的准系统实例。接下来,解决我的问题的基本过程是:

  • app.js中,检查是否cluster.isMaster === true
  • 如果是,请正常启动应用程序并创建工作进程。
  • 如果不是,它是一个工作进程,因此请启动应用的最小版本没有 HTTP 服务器。注册作业流程处理程序。

上面的博客文章更详细地介绍了如何管理这些进程处理程序的创建和注册(包括一个非常好的实现)。它没有提到处理cluster,但希望上述步骤可以帮助遇到此问题的其他人。

编辑:

根据 Travis 的建议(见下面的评论),我放弃了使用 cluster 模块,而是创建了一个 worker.js 文件来做同样的事情。即在worker.js 中,我启动了一个准系统 Sails 应用程序,开始监听新工作。然后,我的主要 Sails 应用程序(Web API)只是响应添加和获取作业(低延迟的东西)。

运行良好,应该可以轻松地与 Heroku 等服务一起使用。

【讨论】:

  • 通常我建议只启动单独的节点实例,并使用 redis 作为共享会话存储在节点之间共享状态。这在 Heroku 等服务上基本上是开箱即用的。
  • 汤姆!我刚发现这个问题,请您成为圣人并回答一个问题,我有点卡住了:stackoverflow.com/questions/31866141/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-26
  • 2013-11-11
  • 1970-01-01
  • 1970-01-01
  • 2021-08-13
  • 1970-01-01
  • 2018-05-19
相关资源
最近更新 更多