2015-03-14 2 views
2

У меня есть приложение на основе SailsJs (http://sailsjs.org/), которое должно иметь дело с некоторыми задачами с интенсивным использованием ЦП. Короче говоря, я хочу использовать модуль , чтобы делегировать обработку этих задач рабочим процессам, чтобы основной цикл событий приложения Sails не блокировался (и поэтому может отвечать на запросы как обычно).Использование модуля кластера узлов с SailsJs: EADDRINUSE

При создании рабочего объекта я получаю ошибку 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}); 
    } 
}; 

При выполнении вышеизложенного, паруса приложение запускается, то при запуске два рабочих пытается запустить приложение еще два раза. Это приводит к двум из следующих ошибок:

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) 

Есть ли способ обойти это? Или альтернативный способ решения этой проблемы?

+0

Похоже, вы поняли это, но если вы хотите поболтать об этом, придите пообщаться в sails.js. Комната Gitter: https://gitter.im/balderdashy/sails –

ответ

1

Я закончил с рекомендацией this blog post, чтобы загрузить экземпляры баребонов приложения. Исходя из этого, основной процесс, чтобы решить мою проблему был:

  • В app.js, проверьте cluster.isMaster === true.
  • Если это так, запустите приложение как обычно и создайте рабочие процессы.
  • Если нет, это рабочий процесс, поэтому загрузите минимальную версию приложения без HTTP-сервера. Зарегистрируйте обработчики процессов.

Вышеупомянутое сообщение в блоге более подробно описано (включая довольно приятную реализацию), как управлять созданием и регистрацией этих обработчиков процессов. В нем нет упоминания о cluster, но, надеюсь, вышеуказанные шаги помогут всем, кто столкнулся с этой проблемой.

EDIT:

По совету Travis (см комментарий), я уронил использование cluster модуля и вместо этого создал worker.js файл, который сделал много то же самое. то есть в worker.js Я загрузил приложение barebones Sails, которое начало прослушивать новые задания. Мое основное приложение Sails (веб-API) просто реагирует на добавление и получение заданий (материал с низкой задержкой).

Прекрасно работает и должен легко работать с такими сервисами, как Heroku.

+0

Обычно я бы рекомендуем просто разворачивать отдельные экземпляры узлов и использовать redis в качестве общего хранилища сеансов для совместного использования состояния между узлами. Это работает в основном из коробки на таких услугах, как Heroku. –

+0

Том! Я только что открыл этот вопрос, не могли бы вы быть святым и ответить на вопрос, я очень сильно застрял: http://stackoverflow.com/questions/31866141/how-do-i-give-my-worker-js -доступ-к-парусов-объект – amingilani

Смежные вопросы