[RabbitMQ] RabbitMQ - 기초

참조


소개

  • RabbitMQ는 메시지 브로커로서 메시지를 받고 전달하는 역학을 합니다.
  • 우체국 같은 역할이라고 생각하면 됩니다.
  • 우편을 보내는 사람이 우편물을 우편함에 넣고 우편 배달부가 우편을 우체국에 전달하게 됩니다.
  • 그리고 우체국에서 분류된 우편을 다시 우편 배달부가 받는 사람에게 전달합니다.
  • 여기서 RabbitMQ와 우체국 간의 가장 큰 차이점은 우편물을 다루지 않고 대신 바이너리 로 된 메시지를 받아 저장하고 전달합니다.

용어 정리

  • Producer : Producing은 메시지를 전송한다는 의미입니다. 메시지를 보내는 Application을 Producer 라고 부릅니다.
  • Queue : MailBox를 의미하며 RabbitMQ 시스템 내에 위치하게 됩니다. RabbitMQ를 통해 사용자 어플리케이션으로 전송 될 때 Queue 안에 저장되어 집니다. Queue는 제한없이 사용자가 원하는 만큼 메시지를 저장할 수 있습니다. 여러 Producer 들은 하나의 Queue를 통해 메시지를 보낼 수 있고 Consumer 들은 Queue로부터 데이터를 받을 수 있습니다.
  • Consumer : Consuming 은 메시지를 수신한다는 의미입니다. 메시지를 받는 User Application 을 Consumer 라고 합니다.

    동일 업무를 처리하는 Consumer 는 보통 하나의 Queue 를 바라봅니다.

    동일 업무를 처리하는 Consumer 가 여러개인 경우 같은 Queue를 바라보게 하면 자동으로 메시지를 분배하여 전달합니다.


다이어그램

  • 아래 다이어그램에서 P는 Producer 이고 C는 Consumer 입니다.
  • 중간에 있는 상자는 RabbitMQ Queue 입니다.
  • RabbitMQ는 Consumer가 받을 메시지를 잠시 저장하는 역할을 합니다.


예제 코드

  • Python 코드로 Send, Receive 파일을 작성합니다.
  • Send는 Publisher 로, queue 에 메시지를 보내는 역할입니다.
  • Receive는 Consumer 로, queue 에 저장된 메시지를 꺼내서 받는 역할입니다.

pika 모듈 설치

  • Python 코드 작성 전에 pika 모듈을 먼저 설치합니다.
pip install pika --upgrade

Send.py

import pika

connection = pika.BlockingConnection(pika.ConnectionParameters('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()

Queue 는 존재 하지 않을 경우에만 생성이 됩니다. 메시지의 내용은 바이트 배열이므로 원하는 대로 인코딩이 가능합니다.


Receive.py

import pika

connection = pika.BlockingConnection(pika.ConnectionParameters('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',
                      auto_ack=True,
                      on_message_callback=callback)

print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()           
  • 위 Receive 코드를 보게 되면, 여기서도 큐를 선언 합니다.
  • Publisher 보다 Consumer 가 먼저 시작할 수 있기 때문입니다.
  • 해당 예제에서는 Send, Receive 둘 중 어느것을 먼저 실행해도 정상적으로 동작합니다.

Send 실행 결과

[x] Sent 'Hello World!'
[x] Sent 'Hello World!'

RabbitMQ Manager 확인

  • RabbitMQ Manager 에서 Queue 개수 확인 결과, 현재 Send 에서 2개의 메시지를 보내서 Queue 에 2개의 메시지가 쌓여 있는 것을 확인할 수 있습니다.


Receive 실행 결과

  • Receive 를 실행 하게 되면, Queue 에 있던 2개의 메시지가 출력되는 것을 확인할 수 있습니다.
(rabbitmq) C:\venvs\rabbitmq>python receive.py
 [*] Waiting for messages. To exit press CTRL+C
 [x] Received b'Hello World!'
 [x] Received b'Hello World!'
728x90

이 글을 공유하기

댓글

Designed by JB FACTORY