与SailsJs:EADDRINUSE一起使用节点群集模块

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

当创build一个worker时,我得到一个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) 

有没有解决的办法? 或者解决这个问题的另一种方法?

我结束了这篇博文的build议,以启动应用程序的准系统实例。 从那以后,解决我的问题的基本过程是:

  • app.js中 ,检查cluster.isMaster === true
  • 如果是,请照常启动应用程序并创build工作进程(es)。
  • 如果没有,这是一个工作进程,所以启动一个最低版本的应用程序没有HTTP服务器 。 注册作业stream程处理程序。

上面的博客文章更详细地介绍了如何pipe理这些stream程处理程序的创build和注册。 它没有提到处理cluster ,但希望上述步骤可以帮助其他人遇到这个问题。

编辑:

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

很好地工作,并应该与Heroku等服务轻松工作。