Development Tip

가장 효율적인 node.js 프로세스 간 통신 라이브러리 / 방법은 무엇입니까?

yourdevel 2021. 1. 6. 20:30
반응형

가장 효율적인 node.js 프로세스 간 통신 라이브러리 / 방법은 무엇입니까?


메시지를 전달할 수 있어야하는 node.js 프로세스가 거의 없습니다. 가장 효율적인 방법은 무엇입니까? node_redis pub / sub 사용 방법

편집 : 프로세스가 다른 컴퓨터에서 실행될 수 있습니다.


한 시스템에서 다른 시스템으로 메시지를 보내고 싶고 콜백에 신경 쓰지 않는다면 Redis pub / sub가 최상의 솔루션입니다. 구현하기가 정말 쉽고 Redis는 정말 빠릅니다.

먼저 컴퓨터 중 하나에 Redis를 설치해야합니다.

Redis에 연결하는 것은 정말 쉽습니다.

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

그러나 방화벽에서 Redis 포트를 여는 것을 잊지 마십시오!

그런 다음 각 시스템을 일부 채널에 등록해야합니다.

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
});

your_namespace전역 네임 스페이스를 건너 뛰고 사용할 있지만 조만간 후회하게 될 것입니다.

메시지를 보내는 것도 정말 쉽습니다.

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

다른 종류의 메시지를 보내려면 메시지 대신 pmessages를 사용할 수 있습니다.

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));
};

가장 좋은 방법은 기능 (예 :)별로 프로세스 (또는 머신)의 이름을 지정하는 것 'send_email'입니다. 이 경우 프로세스 (또는 기계)가 둘 이상의 기능을 구현하는 경우 둘 이상의 채널에 가입 할 수 있습니다.

실제로 redis를 사용하여 양방향 통신을 구축 할 수 있습니다. 그러나 컨텍스트를 잃지 않고 콜백을 수신하려면 각 메시지에 고유 한 콜백 채널 이름을 추가해야하므로 더 까다 롭습니다.

그래서 내 결론은 이것이다. "보내고 잊어 버리는"통신이 필요한 경우 Redis를 사용하고, 완전한 양방향 통신이 필요한 경우 다른 솔루션을 조사하십시오 .


IPC에 ZeroMQ / 0mq사용하지 않는 이유는 무엇 입니까? Redis (데이터베이스)는 IPC와 같은 간단한 작업을 수행하는 데 과잉입니다.

가이드 인용 :

ØMQ (ZeroMQ, 0MQ, zmq)는 내장형 네트워킹 라이브러리처럼 보이지만 동시성 프레임 워크처럼 작동합니다. 프로세스 내, 프로세스 간, TCP 및 멀티 캐스트와 같은 다양한 전송을 통해 원자 메시지를 전달하는 소켓을 제공합니다. 팬 아웃, pub-sub, 작업 배포 및 요청-응답과 같은 패턴으로 소켓 N 대 N을 연결할 수 있습니다. 클러스터 된 제품을위한 패브릭이 될만큼 충분히 빠릅니다. 비동기 I / O 모델은 비동기 메시지 처리 작업으로 구축 된 확장 가능한 멀티 코어 애플리케이션을 제공합니다.

0MQ (또는 노드 코어의 넷 라이브러리를 통한 바닐라 소켓, 0MQ 소켓에서 제공하는 모든 기능 제외)를 사용하는 이점은 마스터 프로세스가 없다는 것입니다. 브로커없는 설정은 설명하는 시나리오에 가장 적합합니다. 하나의 중앙 프로세스에서 다양한 노드로 메시지를 푸시하는 경우 0mq의 PUB / SUB 소켓을 사용할 수 있습니다 (PGM / EPGM을 통한 IP 멀티 캐스트도 지원). 그 외에도 0mq는 사용자 지정 장치를 만들 수있는 다양한 소켓 유형 (PUSH / PULL / XREP / XREQ / ROUTER / DEALER)을 제공합니다.

이 훌륭한 가이드로 시작하세요 : http://zguide.zeromq.org/page:all

0MQ 2.x의 경우 :

http://github.com/JustinTulloss/zeromq.node

0MQ 3.x의 경우 (위 모듈의 포크. PUBSUB에 대한 PUBLISHER 측 필터링을 지원함) :

http://github.com/shripadk/zeromq.node


질문을 한 지 4 년이 지난 후 node-ipc 라는 프로세스 간 통신 모듈이 있습니다. 그것은 적어도 소켓, TCP 및 UDP가 안정적이라고 주장하는 TCP, TLS 및 UDP뿐만 아니라 동일한 시스템에서의 통신을 위해 유닉스 / 윈도우 소켓을 지원합니다.

다음은 github 저장소의 문서에서 가져온 작은 예입니다.

Unix 소켓, Windows 소켓 및 TCP 소켓 용 서버

var ipc=require('node-ipc');

ipc.config.id   = 'world';
ipc.config.retry= 1500;

ipc.serve(
    function(){
        ipc.server.on(
            'message',
            function(data,socket){
                ipc.log('got a message : '.debug, data);
                ipc.server.emit(
                    socket,
                    'message',
                    data+' world!'
                );
            }
        );
    }
);

ipc.server.start();

Unix 소켓 및 TCP 소켓 용 클라이언트

var ipc=require('node-ipc');

ipc.config.id   = 'hello';
ipc.config.retry= 1500;

ipc.connectTo(
    'world',
    function(){
        ipc.of.world.on(
            'connect',
            function(){
                ipc.log('## connected to world ##'.rainbow, ipc.config.delay);
                ipc.of.world.emit(
                    'message',
                    'hello'
                )
            }
        );
        ipc.of.world.on(
            'disconnect',
            function(){
                ipc.log('disconnected from world'.notice);
            }
        );
        ipc.of.world.on(
            'message',
            function(data){
                ipc.log('got a message from world : '.debug, data);
            }
        );
    }
);

현재이 모듈을 stdin / stdout을 통해 이전 솔루션을 대체하는 대체 로컬 ipc (하지만 향후 원격 ipc가 될 수 있음)에 대해 평가하고 있습니다. 이 모듈이 어떻게 어떻게 작동하는지 더 많은 정보를 제공하기 위해 완료되면 대답을 확장 할 수 있습니다.


i would start with the built in functionality that node provide.
you can use process signalling like:

process.on('SIGINT', function () {
  console.log('Got SIGINT.  Press Control-D to exit.');
});

this signalling

Emitted when the processes receives a signal. See sigaction(2) for a list of standard POSIX signal names such as SIGINT, SIGUSR1, etc.

Once you know about process you can spwn a child-process and hook it up to the message event to retrive and send messages. When using child_process.fork() you can write to the child using child.send(message, [sendHandle]) and messages are received by a 'message' event on the child.

Also - you can use cluster. The cluster module allows you to easily create a network of processes that all share server ports.

var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  // Fork workers.
  for (var i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  cluster.on('exit', function(worker, code, signal) {
    console.log('worker ' + worker.process.pid + ' died');
  });
} else {
  // Workers can share any TCP connection
  // In this case its a HTTP server
  http.createServer(function(req, res) {
    res.writeHead(200);
    res.end("hello world\n");
  }).listen(8000);
}

For 3rd party services you can check: hook.io, signals and bean.


take a look at node-messenger

https://github.com/weixiyen/messenger.js

will fit most needs easily (pub/sub ... fire and forget .. send/request) with automatic maintained connectionpool


we are working on multi-process node app, which is required to handle large number of real-time cross-process message.

We tried redis-pub-sub first, which failed to meet the requirements.

Then tried tcp socket, which was better, but still not the best.

So we switched to UDP datagram, that is much faster.

Here is the code repo, just a few of lines of code. https://github.com/SGF-Games/node-udpcomm

ReferenceURL : https://stackoverflow.com/questions/6463945/whats-the-most-efficient-node-js-inter-process-communication-library-method

반응형