복붙노트

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

REDIS

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

우리는 메시지를 전달할 수 있어야합니다 몇 Node.js를 프로세스를 그 일을 가장 효율적인 방법은 무엇입니까? 어떻게 node_redis 술집 / 하위 사용에 대한

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

해결법

  1. ==============================

    1.당신이 한 컴퓨터에서 다른 컴퓨터로 메시지를 전송하고 콜백에 대한 상관 없어 원한다면 레디 스 선술집 / 서브 최적의 솔루션입니다. 그것은 구현하기가 정말 쉽습니다와 레디 스 정말 빠릅니다.

    당신이 한 컴퓨터에서 다른 컴퓨터로 메시지를 전송하고 콜백에 대한 상관 없어 원한다면 레디 스 선술집 / 서브 최적의 솔루션입니다. 그것은 구현하기가 정말 쉽습니다와 레디 스 정말 빠릅니다.

    첫째로 당신은 당신의 시스템 중 하나에서 레디 스를 설치해야합니다.

    레디 스에 연결하기 위해 정말 쉽습니다 :

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

    그러나 방화벽에서 레디 스 포트를 열기에 대해 잊지 마세요!

    그럼 당신은 어떤 채널에 각 기계를 구독 할 수 있습니다 :

    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') 그 기능하여 프로세스 (또는 기계) 이름을 지정하는 것입니다. 더 하나 개의 기능을 구현하는 경우보다 그 경우의 공정에서, (또는 시스템)는 하나 개 이상의 채널에 등록 할 수있다.

    사실, 레디 스를 사용하여 양방향 통신을 구축하는 것이 가능하다. 그러나 그것은 문맥을 잃지 않고 콜백 받기 위해 각 메시지에 고유의 콜백 채널 이름을 추가 할 필요하기 때문에 더 까다입니다.

    그래서, 내 결론은 이것이다 : 사용 레디 스 만약 당신이 필요 당신이 본격적인 양방향 통신을 필요로하는 경우 다른 솔루션을 연구, "보내고 잊어"통신.

  2. ==============================

    2.왜 IPC에 대한 ZeroMQ / 0mq를 사용하지? 레디 스 (데이터베이스)는 IPC로 간단하게 일을위한 오버 죽입니다.

    왜 IPC에 대한 ZeroMQ / 0mq를 사용하지? 레디 스 (데이터베이스)는 IPC로 간단하게 일을위한 오버 죽입니다.

    가이드를 인용 :

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

    이 훌륭한 가이드와 함께 시작 http://zguide.zeromq.org/page:all

    0MQ 2.x를 들어 :

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

    0MQ 3.x를 들어. (상기 모듈이 포크 지지부 출판사 측 PUBSUB 필터링)

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

  3. ==============================

    3.질문 후 4 년 이상 노드-IPC라는 프로세스 간 통신 모듈이 부탁드립니다. 그것은 적어도 소켓에서 TCP와 UDP가 안정적 주장, 동일한 시스템에 통신뿐만 아니라 TCP, TLS 및 UDP에 대한 유닉스 / 윈도우 소켓을 지원합니다.

    질문 후 4 년 이상 노드-IPC라는 프로세스 간 통신 모듈이 부탁드립니다. 그것은 적어도 소켓에서 TCP와 UDP가 안정적 주장, 동일한 시스템에 통신뿐만 아니라 TCP, TLS 및 UDP에 대한 유닉스 / 윈도우 소켓을 지원합니다.

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

    유닉스 소켓, 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();
    

    유닉스 소켓 및 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);
                }
            );
        }
    );
    

    필자는 현재 대체 지역 IPC이 모듈을 평가하는 (그러나 미래의 원격 IPC 수) 표준 입력 / 표준 출력을 통해 기존 솔루션에 대한 대체. 나는 좀 더 많은 정보를 어떻게 그리고 얼마나 좋은이 모듈이 작동을 제공하기 위해 수행하고있을 때 어쩌면 내 대답을 확장됩니다.

  4. ==============================

    4.노드가 제공하는 기능 내장으로 내가 시작합니다. 당신은 같은 신호 프로세스를 사용할 수 있습니다 :

    노드가 제공하는 기능 내장으로 내가 시작합니다. 당신은 같은 신호 프로세스를 사용할 수 있습니다 :

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

    이 신호

    당신이 과정에 대해 알게되면 당신은 자식 프로세스를 spwn 및 PIN이 메시지를 보낼 수있는 메시지 이벤트로를 연결 할 수 있습니다. child_process.fork를 사용하는 경우 () 당신은 child.send를 사용하여 아이를 쓸 수 있습니다 (메시지, [sendHandle]) 및 메시지는 자녀에 '메시지'이벤트에 의해 수신됩니다.

    또한 - 당신은 클러스터를 사용할 수 있습니다. 클러스터 모듈은 쉽게 프로세스의 모든 공유 서버 포트의 네트워크를 만들 수 있습니다.

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

    제 3 자 서비스의 당신은 확인할 수 있습니다 : hook.io, 신호 콩.

  5. ==============================

    5.노드 메신저를 살펴

    노드 메신저를 살펴

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

    가장 쉽게 요구에 맞게 (술집 / 서브 ... 화재와 .. 보내기 / 요청을 잊지) 자동 유지 connectionpool와 함께합니다

  6. ==============================

    6.우리는 실시간 프로세스 간 메시지의 많은 수를 처리하는 데 필요한 다중 프로세스 노드 앱에 노력하고 있습니다.

    우리는 실시간 프로세스 간 메시지의 많은 수를 처리하는 데 필요한 다중 프로세스 노드 앱에 노력하고 있습니다.

    우리는 요구 사항을 충족하는 데 실패하는 최초의 레디 스 - 술집 - 서브를 시도했다.

    그런 다음 최선을 개선했다 TCP 소켓을 시도했지만 아직도.

    우리가 UDP 데이터 그램으로 전환 그래서, 그 훨씬 빠릅니다.

    여기에 코드의 repo, 코드 라인의 몇 가지입니다. https://github.com/SGF-Games/node-udpcomm

  7. from https://stackoverflow.com/questions/6463945/whats-the-most-efficient-node-js-inter-process-communication-library-method by cc-by-sa and MIT license