Docker를 이용한 대용량 메시지 큐 RabbitMQ 설치 및 사용방법

개요

Software Maestro 11기 과정 중 크롤러를 멀티프로세싱하기 위해 대용량 메시지 큐인 RabbitMQ를 사용하는 과정을 알아본다.

Why Message Queue?

크롤러를 여러개 돌리는 것을 생각했을 때 두가지 옵션이 있었다. 첫째는 멀티쓰레드를 이용한 크롤링, 둘째는 메시지 큐를 이용하여 크롤러 자체를 여러개 켜서 진행하는 크롤링이였다.

두번째 방법을 선택했는데, 이유는 다음과 같다.

  1. 여러 컴퓨터에서 동시에 돌릴 수 있다.(크롤러가 그때 필요한 링크를 받아가기 때문에)
  2. 실패시 다시 큐에 넣을 수 있다.
  3. 메시지 큐를 이용해보고 싶었다.

그리고 멀티쓰레드를 이용한 로직 구상보다 메시지 큐를 이용한 프로그램 로직 구상이 좀 더 잘 되었다.

Why RabbitMQ?

RabbitMQ를 사용한 이유는 다음과 같다.

  1. 관리 UI가 있어 편하게 관리 가능함.
  2. 모든 언어와 운영체제를 지원함.
  3. 오픈소스로 상업적 지원이 가능함.
  4. pika 모듈로 코드 구성이 무척 쉬움.

무엇보다 메시지 큐를 처음 사용하는 입장에서 사용하기 간편했던 것이 가장 큰 이유였다.

RabbitMQ 설치하기

서버에 Docker image로 RabbitMQ를 설치했는데, 정말 물건이다.

$ docker run -d --hostname my-rabbit --name some-rabbit rabbitmq:3

위와 같은 코드 한줄이면 모든 세팅이 끝난다.

👉Docker 사용법을 알고 싶다면? 도커 안내소

내 경우엔 AWS를 이용했기 때문에 보안그룹에서 포트를 열어주어야 한다. rabbitmq default 포트는 30000이다.

RabbitMQ Hello world

RabbitMQ에서 공식적으로 지원하는 라이브러리는 Pika이다. 다음은 공식 문서의 send.py이다.

#!/usr/bin/env python
import pika

connection = pika.BlockingConnection(
    pika.ConnectionParameters(host='localhost'))
channel = connection.channel()

channel.queue_declare(queue='hello')

channel.basic_publish(exchange='', routing_key='hello', body='Hello World!')
print(" [x] Sent 'Hello World!'")
connection.close()

다음은 공식 문서의 receive.py이다.

#!/usr/bin/env python
import pika

connection = pika.BlockingConnection(
    pika.ConnectionParameters(host='localhost'))
channel = connection.channel()

channel.queue_declare(queue='hello')


def callback(ch, method, properties, body):
    print(" [x] Received %r" % body)


channel.basic_consume(
    queue='hello', on_message_callback=callback, auto_ack=True)

print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()

다음엔 크롤러를 여러개 실행시켜줄 supervisor을 알아보자.

댓글남기기