[RabbitMQ] 5장. Topic 활용

RabbitMQ 매뉴얼

목차

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

작성일 : 2018.09.11


5. Topic 활용

Topic을 쓰는 이유


Topic Exchange

Topic과 routing key

추가사항


emit_logs_topic.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 = 'topic_logs';
      // exchange를 생성하는 것까지는 동일하다.

    var args = process.argv.slice(2);
    var key = (args.length > 0) ? args[0] : 'anonymous.info';
      // args에 따라서 라우팅 키를 생성한다.

    var msg = args.slice(1).join(' ') || 'Hello World!';
      // 전송할 메시지의 내용이 된다.

    ch.assertExchange(ex, 'topic', {durable: false});
      // direct 타입이 아니라 topic 타입으로 exchange를 생성한다.

    ch.publish(ex, key, new Buffer(msg));
      // 메시지를 publish 할 때, args에 따라 생성된 라우팅 키를 적용한다.

    console.log(" [x] Sent %s: '%s'", key, msg);
  });

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

/*
    ./emit_log_topic.js "kern.critical" "A critical kernel error"
    "kern.critical" 타입의 라우팅 키를 가진 메시지를 생성해 전송한다.
*/

receive_logs_topic.js

#!/usr/bin/env node

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

var args = process.argv.slice(2);

if (args.length == 0) {
  console.log("Usage: receive_logs_topic.js <facility>.<severity>");
  process.exit(1);
}

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

    ch.assertExchange(ex, 'topic', {durable: false});
      // topic 타입의 exchange에 연결된다.

    ch.assertQueue('', {exclusive: true}, function(err, q) {
      console.log(' [*] Waiting for logs. To exit press CTRL+C');

      args.forEach(function(key) {
        ch.bindQueue(q.queue, ex, key);
          // 방법은 비슷한데, 바인딩 키가 아니라 라우팅 키를 생성해
          // 큐에 연결하는 점이 다르다. (severity > key)
      });

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

/*
    ./receive_logs_topic.js "#"
    모든 로그를 받는다.

    ./receive_logs_topic.js "kern.*"
    kern에서부터 오는 로그를 받는다.

    ./receive_logs_topic.js "*.critical"
    로그의 severity 중 critical 한 것만 받는다.

    ./receive_logs_topic.js "kern.*" "*.critical"
    multiple binding도 설정할 수 있다.
*/  

참고 문헌

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