Docker를 이용한 대용량 메시지 큐 RabbitMQ 설치 및 사용방법
개요
Software Maestro 11기 과정 중 크롤러를 멀티프로세싱하기 위해 대용량 메시지 큐인 RabbitMQ를 사용하는 과정을 알아본다.
Why Message Queue?
크롤러를 여러개 돌리는 것을 생각했을 때 두가지 옵션이 있었다. 첫째는 멀티쓰레드를 이용한 크롤링, 둘째는 메시지 큐를 이용하여 크롤러 자체를 여러개 켜서 진행하는 크롤링이였다.
두번째 방법을 선택했는데, 이유는 다음과 같다.
- 여러 컴퓨터에서 동시에 돌릴 수 있다.(크롤러가 그때 필요한 링크를 받아가기 때문에)
- 실패시 다시 큐에 넣을 수 있다.
- 메시지 큐를 이용해보고 싶었다.
그리고 멀티쓰레드를 이용한 로직 구상보다 메시지 큐를 이용한 프로그램 로직 구상이 좀 더 잘 되었다.
Why RabbitMQ?
RabbitMQ를 사용한 이유는 다음과 같다.
- 관리 UI가 있어 편하게 관리 가능함.
- 모든 언어와 운영체제를 지원함.
- 오픈소스로 상업적 지원이 가능함.
- 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을 알아보자.
댓글남기기