example - Comunicación entre dos procesos diferentes en Node.js
sigterm nodejs (3)
El caso de uso que describe me hace pensar en dnode , con el que puede exponer fácilmente las funciones para que sean llamadas por diferentes procesos, coordinados por dnode, que utiliza sockets de red (y socket.io, para que pueda usar el mismo mecanismo en el navegador) .
Otro enfoque sería utilizar una cola de mensajes, hay muchos enlaces buenos para diferentes colas de mensajes .
La forma más sencilla de que yo sepa, es usar child_process.fork() :
Este es un caso especial de la funcionalidad
spawn()
para procesos de Nodo de desove. Además de tener todos los métodos en una instancia normal de ChildProcess, el objeto devuelto tiene un canal de comunicación incorporado. El canal se escribe conchild.send(message, [sendHandle])
y los mensajes son recibidos por un evento''message''
en el niño.
Entonces, para su ejemplo, podría tener 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''});
Y ejemplo1.js:
function func(input) {
process.send(''Hello '' + input);
}
process.on(''message'', function(m) {
func(m);
});
El problema es:
Supongamos que tenemos dos procesos Node.js en ejecución:
example1.js
yexample2.js
.En
example1.js
hay una funciónfunc1(input)
que devuelveresult1
como resultado.¿Hay una manera desde dentro de
example2.js
para llamar afunc1(input)
y obtenerresult1
como el resultado?
Por lo que he aprendido sobre Node.js, solo he encontrado una solución que usa sockets para la comunicación. Sin embargo, esto no es ideal porque requeriría un proceso de escucha en un puerto. Si es posible deseo evitar eso.
EDITAR: Después de algunas preguntas, me gustaría agregar que en la jerarquía example1.js
no puede ser un proceso secundario de example2.js
, sino todo lo contrario. Además, si ayuda, solo puede haber un example1.js
procesando sus propios datos y muchos example2.js
procesan los propios datos + datos del primer proceso.
Puede ser que debas probar Messenger.js . Puede hacer IPC de una manera práctica.
No tienes que hacer la comunicación entre los dos procesos por ti mismo.
Usa Redis como un mensaje de bus / broker.
https://redis.io/topics/pubsub
También puede usar mensajes de socket como ZeroMQ, que son punto a punto / punto a punto, en lugar de usar un intermediario de mensajes como Redis.
¿Como funciona esto?
Con Redis, en ambas aplicaciones de nodo tiene dos clientes Redis haciendo pub / sub. Así que cada aplicación node.js tendría un editor y un cliente suscriptor (sí, necesita 2 clientes por proceso de nodo para Redis pub / sub)
Con ZeroMQ, puede enviar mensajes a través de canales IPC, directamente entre los procesos de node.js, (sin intermediario involucrado, excepto tal vez el propio sistema operativo ..).