[RabbitMQ] 3장. Pub/sub 기능 활용

RabbitMQ 매뉴얼

목차

  1. RabbitMQ 소개
  2. Work Queue 활용
  3. Pub/sub 기능 활용
  4. Routing 활용
  5. Topic 활용

작성일 : 2018.09.11


3. Pub/sub 기능 활용

Pub/sub을 쓰는 이유


Pub/sub 이해하기

이미지

Temporary Queues

Bindings

이미지

정리하면?


이미지

emit_logs.js

#!/usr/bin/env node

var amqp = require('amqplib/callback_api');

amqp.connect('amqp://localhost', function(err, conn) {
  conn.createChannel(function(err, ch) {
    var ex = 'logs';
      // 채널에 연결된 후, exchange를 생성한다.
    var msg = process.argv.slice(2).join(' ') || 'Hello World!';

    ch.assertExchange(ex, 'fanout', {durable: false});
      // exchange의 타입을 fanout으로 지정한 뒤 연결한다.

    ch.publish(ex, '', new Buffer(msg));
      // 인자 : 전송할 ex이름, 메시지를 보낼 큐 지정, 메시지 내용
      // 큐를 딱히 지정하지 않았으므로 모든 큐에게 보낸다.
      
    console.log(" [x] Sent %s", msg);
  });

  setTimeout(function() { conn.close(); process.exit(0) }, 500);
});

receive_logs.js

#!/usr/bin/env node

var amqp = require('amqplib/callback_api');

amqp.connect('amqp://localhost', function(err, conn) {
  conn.createChannel(function(err, ch) {
    var ex = 'logs';

    ch.assertExchange(ex, 'fanout', {durable: false});
      // exchange를 fanout 타입으로 생성해 연결한다.

    ch.assertQueue('', {exclusive: true}, function(err, q) {
      // exclusive를 true로 설정해서 temporary queue를 사용하도록 한다.
      // 여기서는 q가 임시로 만든 큐를 리턴해준다.
    
      console.log(" [*] Waiting for messages in %s. To exit press CTRL+C", q.queue);
      
      ch.bindQueue(q.queue, ex, '');
        // 리턴 받은 큐와 채널에서 생성한 exchange를 bind 해준다.
        // 인자 : 큐 이름, ex 이름, 라우팅
        // 세번째 인자가 없으므로 해당 큐는 ex에서 오는 모든 메시지를 받는다.

      ch.consume(q.queue, function(msg) {
        console.log(" [x] %s", msg.content.toString());
      }, {noAck: true});
    });
  });
});

참고 문헌

RabbitMQ 공식 홈페이지의 튜토리얼을 번역하며 공부한 내용입니다.