sql >> Base de Datos >  >> NoSQL >> Redis

¿Cuál es la biblioteca/método de comunicación entre procesos node.js más eficiente?

Si desea enviar mensajes de una máquina a otra y no le importan las devoluciones de llamada, Redis pub/sub es la mejor solución. Es realmente fácil de implementar y Redis es realmente rápido.

Primero debe instalar Redis en una de sus máquinas.

Es realmente fácil conectarse a Redis:

var client = require('redis').createClient(redis_port, redis_host);

¡Pero no se olvide de abrir el puerto Redis en su firewall!

Luego, debe suscribir cada máquina a algún canal:

client.on('ready', function() {
  return client.subscribe('your_namespace:machine_name');
});

client.on('message', function(channel, json_message) {
  var message;
  message = JSON.parse(message);
  // do whatever you vant with the message
});

Puede omitir your_namespace y usa el espacio de nombres global, pero te arrepentirás tarde o temprano.

También es muy fácil enviar mensajes:

var send_message = function(machine_name, message) {
  return client.publish("your_namespace:" + machine_name, JSON.stringify(message));
};

Si desea enviar diferentes tipos de mensajes, puede usar pmessages en lugar de mensajes:

client.on('ready', function() {
  return client.psubscribe('your_namespace:machine_name:*');
});

client.on('pmessage', function(pattern, channel, json_message) {
  // pattern === 'your_namespace:machine_name:*'
  // channel === 'your_namespace:machine_name:'+message_type
  var message = JSON.parse(message);
  var message_type = channel.split(':')[2];
  // do whatever you want with the message and message_type
});

send_message = function(machine_name, message_type, message) {
  return client.publish([
    'your_namespace',
    machine_name,
    message_type
  ].join(':'), JSON.stringify(message));
};

La mejor práctica es nombrar sus procesos (o máquinas) por su funcionalidad (por ejemplo, 'send_email' ). En ese caso, el proceso (o máquina) puede estar suscrito a más de un canal si implementa más de una funcionalidad.

En realidad, es posible construir una comunicación bidireccional usando redis. Pero es más complicado ya que requeriría agregar un nombre de canal de devolución de llamada único a cada mensaje para recibir la devolución de llamada sin perder el contexto.

Entonces, mi conclusión es esta:Use Redis si necesita una comunicación de "enviar y olvidar", investigue otras soluciones si necesita una comunicación bidireccional completa .