Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Qual é a biblioteca/método de comunicação entre processos node.js mais eficiente?


Se você deseja enviar mensagens de uma máquina para outra e não se importa com retornos de chamada, o Redis pub/sub é a melhor solução. É muito fácil de implementar e o Redis é muito rápido.

Primeiro você precisa instalar o Redis em uma de suas máquinas.

É muito fácil se conectar ao Redis:
var client = require('redis').createClient(redis_port, redis_host);

Mas não se esqueça de abrir a porta Redis em seu firewall!

Então você tem que inscrever cada máquina em algum 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
});

Você pode pular your_namespace e use namespace global, mas você vai se arrepender mais cedo ou mais tarde.

Também é muito fácil enviar mensagens:
var send_message = function(machine_name, message) {
  return client.publish("your_namespace:" + machine_name, JSON.stringify(message));
};

Se você deseja enviar diferentes tipos de mensagens, pode usar pmessages em vez de mensagens:
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));
};

A melhor prática é nomear seus processos (ou máquinas) por sua funcionalidade (por exemplo, 'send_email' ). Nesse caso, o processo (ou máquina) pode ser inscrito em mais de um canal se implementar mais de uma funcionalidade.

Na verdade, é possível construir uma comunicação bidirecional usando redis. Mas é mais complicado, pois seria necessário adicionar um nome de canal de retorno de chamada exclusivo a cada mensagem para receber o retorno de chamada sem perder o contexto.

Então, minha conclusão é esta:Use o Redis se você precisar de comunicação "enviar e esquecer", investigue outras soluções se você precisar de comunicação bidirecional completa .