Связь между двумя различными процессами в Node.js
Проблема:
-
Предположим, что мы выполняем два процесса Node.js: example1.js
и example2.js
.
-
В example1.js
есть функция func1(input)
, которая возвращает result1
.
-
Есть ли способ изнутри example2.js
вызвать func1(input)
и получить result1
в качестве результата?
Из того, что я узнал о Node.js, я нашел только одно решение, которое использует сокеты для связи. Это меньше, чем идеально, потому что для этого потребуется один процесс, прослушивающий порт. Если возможно, я хочу этого избежать.
EDIT: после некоторых вопросов я хотел бы добавить, что в иерархии example1.js
не может быть дочерний процесс example2.js
, а наоборот. Кроме того, если это помогает - может быть только один example1.js
обработать свои собственные данные и многие example2.js
обработать собственные данные + данные из первого процесса.
Ответы
Ответ 1
Приведенный вами пример использования заставляет меня думать о dnode, с помощью которого вы можете легко выставлять функции, которые будут вызываться различными процессами, координируемыми dnode, который использует сетевые сокеты (и socket.io, поэтому вы можете использовать тот же механизм в браузере).
Другим подходом было бы использование очереди сообщений, есть много хороших привязок для разных очередей сообщений.
Самый простой способ, насколько мне известно, - child_process.fork():
Это частный случай функции spawn()
для нереста процессов Node. Помимо наличия всех методов в обычном экземпляре ChildProcess, возвращаемый объект имеет встроенный канал связи. Канал записывается с помощью child.send(message, [sendHandle])
, и сообщения принимаются событием 'message'
для дочернего элемента.
Итак, для вашего примера у вас может быть example2.js:
var fork = require('child_process').fork;
var example1 = fork(__dirname + '/example1.js');
example1.on('message', function(response) {
console.log(response);
});
example1.send({func: 'input'});
И example1.js:
function func(input) {
process.send('Hello ' + input);
}
process.on('message', function(m) {
func(m);
});
Ответ 2
Возможно, вам стоит попробовать Messenger.js. Он может сделать IPC удобным способом.
Вам не нужно выполнять связь между двумя процессами самостоятельно.
Ответ 3
Использовать Redis как шину/брокер сообщений.
https://redis.io/topics/pubsub
Вы также можете использовать сообщения сокетов, такие как ZeroMQ, которые указывают на точечный/одноранговый обмен, вместо использования брокера сообщений, такого как Redis.
Как это работает?
При использовании Redis в ваших приложениях node у вас есть два клиента Redis, делающие pub/sub. Таким образом, каждое приложение node.js будет иметь клиент издателя и подписчика (да, вам нужно 2 клиента за node для Redis pub/sub)
С ZeroMQ вы можете отправлять сообщения через IPC-каналы непосредственно между процессами node.js(без участия брокера - кроме, возможно, самой ОС..).