2012-02-28 2 views
1

Я пытаюсь реализовать API, который взаимодействует с сервером NodeJS для обмена сообщениями в режиме реального времени. Теперь, когда приложение NodeJS развернуто в масштабируемой среде, например Heroku, может быть запущено несколько экземпляров этого приложения.Обмен сообщениями в реальном времени с помощью NodeJS для нескольких процессов

Возможно ли создать проект узла так, чтобы все клиенты, подписанные на «канал сообщений», получили это сообщение, хотя выполняются экземпляры нескольких узлов - и, следовательно, несколько копий этого канала?

+0

Интересный вопрос. Интересно, если вы считаете базу данных, содержащую статистику и еще что-то, а затем каждый процесс пинает это время от времени? – Marshall

+0

Да, но это может привести к поразительной остроте узла. По существу, это не что иное, как опрос. –

+0

[Это сообщение] (http://stackoverflow.com/questions/8490093/node-js-share-sockets-between-processes) может иметь значение. – Marshall

ответ

0

Отъезд zeromq, он должен предоставить несколько простых высокопроизводительных абстракций IPC, чтобы делать то, что вы хотите. В частности, полезно использовать the pub/sub example.

Основная задача, которую я представляю себе, не зная ничего о том, как Heroku порождает несколько экземпляров сервера, будет логикой определения, кто является издателем (остальные экземпляры будут подписчиками). Итак, допустим, ради аргумента, что ваш хостинг-провайдер дает вам переменную среды, называемую INSTANCE_NUM, которая является целым числом в [0,1024], указывая номер экземпляра процесса; поэтому мы скажем, что экземпляр zero является издателем сообщений.

var zmq = require('zeromq') 
if (process.env['INSTANCE_NUM'] === '0') { // I'm the publisher. 
    var emitter = getEventEmitter(); // e.g. an HttpServer. 
    var pub = zmq.createSocket('pub'); 
    pub.bindSync('tcp://*:5555'); 
    emitter.on('someEvent', function(data) { 
    pub.send(data); 
    }); 
} else { // I'm a subscriber. 
    var sub = zmq.createSocket('sub'); 
    sub.subscribe(''); 
    sub.on('message', function(data) { 
    // Handle the event data... 
    }); 
    sub.connect('tcp://localhost:5555'); 
} 

Обратите внимание, что я новичок в zeromq, и приведенный выше код полностью не проверен, просто для демонстрации.

+0

@DenizOzger спасибо за указатель re: подписка. – maerics

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