Подтвердить что ты не робот

Связь между двумя различными процессами в 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 обработать собственные данные + данные из первого процесса.

4b9b3361

Ответ 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(без участия брокера - кроме, возможно, самой ОС..).