[RabbitMQ] 2장. Work Queue 활용

RabbitMQ 매뉴얼

목차

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

작성일 : 2018.09.11


2. Work Queue 활용

Work Queues란?

이미지

작업 큐를 만들어서 time-consuming task를 여러 worker에게 분할한다.


Work Queues의 특징과 기능들

Round-Robin Dispatching

Message Acknowledgement

Message Durability

Fair Dispatch

이미지


new_task.js

#!/usr/bin/env node

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

amqp.connect('amqp://localhost', function(err, conn) {
  conn.createChannel(function(err, ch) {
    var q = 'task_queue';
    var msg = process.argv.slice(2).join(' ') || "Hello World!";
      // 보낼 메시지의 내용을 argv로 받아온다.

    ch.assertQueue(q, {durable: true});
      // durable을 true로 설정해 RabbitMQ 서버가 죽어도 잃어버리지 않게 한다.

    ch.sendToQueue(q, new Buffer(msg), {persistent: true});
      // persistent을 true로 설정해 잃어버리지 않게 한다.
      
    console.log(" [x] Sent '%s'", msg);
  });
  setTimeout(function() { conn.close(); process.exit(0) }, 500);
});

worker.js

#!/usr/bin/env node

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

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

    ch.assertQueue(q, {durable: true});
    ch.prefetch(1);
      // prefetch를 1로 설정해 1개 이상의 메시지를 동시에 받지 않도록 한다.

    console.log(" [*] Waiting for messages in %s. To exit press CTRL+C", q);

    ch.consume(q, function(msg) {
      var secs = msg.content.toString().split('.').length - 1;

      console.log(" [x] Received %s", msg.content.toString());
      setTimeout(function() {
        console.log(" [x] Done");
        ch.ack(msg);
      }, secs * 1000);  // setTimeout을 통해 메시지를 처리하는 데 시간이 드는 '척'한다.
    }, {noAck: false}); // noAck을 false로 설정해 RabbitMQ에게 ack를 전달하도록 한다.
  });
});

참고 문헌

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