[RabbitMQ] Python에서 RabbitMQ 사용 방법

es.Seong·2023년 5월 15일
0

RabbitMQ

목록 보기
1/2
post-thumbnail

회사에 입사하고 사내에서 사용하는 툴들을 익혀야하기 때문에 velog를 시작했다. 이렇게 기록해두면 회사에서 삽질(?)도 덜하고 업무 효율이 조금이나마 오르지 않을까...!

학습 목표

RabbitMQ를 통한 데이터 송수신 기능 구현 지식 함양

RabbitMQ

RabbitMQ는 AMQP(Advanced Message Queuing Protocol)를 구현한 메세지 브로커. 프로듀서(P)와 컨슈머(C)가 메세지를 주고받을 때, RabbitMQ는 이들 간의 연결을 담당하고, 메세지를 수신한 컨슈머에게 전달. RabbitMQ는 메세지 큐의 역할을 하며, 메세지를 안전하고 효율적으로 전달한다.
(동일한 기능을 하는 오픈소스는 Kafka가 있다.)

설치 및 튜토리얼 참고 블로그

아래 블로그를 참고해서 RabbitMQ를 윈도우 로컬 환경에서 실행할 수 있는 환경을 구축하였습니다.

https://syhwang.tistory.com/93
https://heodolf.tistory.com/50
https://oingdaddy.tistory.com/165
https://blog.storyg.co/rabbitmqs/tutorials/python/03-pub-sub

RabbitMQ 설치를 간단히 요약하면 다음과 같다.

  1. Erlang 설치
  2. RabbitMQ 설치
  3. RabbitMQ 환경변수 설정

유의사항
Erlang은 사용할 RabbitMQ 버전과 호환되는 버전을 설치해야함.

이 세 과정을 통해 로컬 환경에서 RabbitMQ를 실행할 수 있다.

RabbitMQ Server Management Plugin 설정

rabbitmq-plugins enable rabbitmq_management

cmd 창에 다음 명령어를 입력하여 플러그인을 활성화 할 수 있다.

설정된 것을 확인하려면
rabbitmq-plugins list
해당 명령어를 실행하여 E ,e 표시가 된 것을 확인할 수 있다.

명령을 사용하여 RabbitMQ 관리 플러그인을 활성화하면 웹 기반 관리 도구를 사용하여 RabbitMQ 서버를 모니터링, 관리, 유지 관리할 수 있으며, 사용자 및 권한 설정, 통계 및 모니터링 데이터 접근 등을 수행할 수 있다.

RabbitMQ Server 실행

rabbitmq-server 명령어를 통해 RabbiMQ를 활성화 할 수 있다.
해당 주소를 통해 접속 가능.
http://localhost:15672/

접속하면 다음과 같이 로그인화면이 나온다.
계정을 만들지 않았기 때문에 guest 계정으로 로그인을 진행.

Username: guest
Password: guest

계정 생성 방법

rabbitmqctl add_user Username Password
위 예시처럼 입력해주면 계정이 생성된다.

역할(권한) 설정

rabbitmqctl set_user_tags Username administrator
이를 통해 생성한 계정에 역할을 설정할 수 있다.

rabbitmqctl list_users
해당 명령어를 통해 생성된 계정을 모두 확인할 수 있다. 처음 admin 계정인 guest와 동일한 역할(권한)인 test 계정이 생성되었다.

로그인 후 접속

로그인 후 RabbitMQ 메인 화면이 출력된다.
현재 메세지큐에 저장된 메시지의 개수, 실행 중인 메시지 수 등을 시각적으로 확인할 수 있다.

RabbitMQ with Python

간단한 파이썬 예제를 통해 RabbitMQ가 동작하는 원리에 대해 알아보자.
파이썬에서는 pika라는 라이브러리를 통해 RabbitMQ를 사용할 수있다.

pip install pika

Basic Producer Code

import pika

#RabbitMQ 서버에 연결
#connection과 channel를 생성
connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
channel = connection.channel()

#queue_declare: channel를 통해 queue 선언(declare)
channel.queue_declare(queue='hello')
#메시지를 RabbitMQ 큐에 전송
channel.basic_publish(exchange='', routing_key='hello', body='Hello World!')
print(" [x] Sent 'Hello World!'")
# 연결 종료
connection.close()

실행 결과

이전 화면과는 다르게 Ready의 숫자가 0에서 증가한 것을 확인할 수 있다.
VScode를 실수로 두 번 눌러 다음과 같이 Ready가 2가 된 것을 확인할 수 있다.

Overview에서 Queues로 이동하면 queue_declare 를 통해 선언했던 큐 이름이 등록된 것을 확인할 수 있다.

Basic Consumer Code

import pika
# RabbitMQ 서버 연결 설정
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()
connection.close()

해당 코드를 실행하면 큐에 저장된 모든 메시지를 소비한다.
해당 코드는 무한 루프문이기 때문에 Ctrl + C를 통해 종료하지만, 추가적인 코드가 더 있다면 조건을 추가해서 중단하는 로직을 구현해야한다.

실행결과

메시지큐에 메시지가 2개 저장되어있기 때문에 Received Hello world가 두 번 출력된 것을 확인할 수 있다.

웹서버를 통해서 저장된 메시지가 모두 소비된 것을 확인할 수 있다.

활용방안

  • 특정 조건(시간, 클릭 등)에 메시지 큐에 실행할 기능을 저장 및 소비
  • RabbitMQ를 사용하면 딥러닝 스케줄러도 구현이 가능할 것 같음.
    ex) 매달 1일에 서버에 저장된 딥러닝 모델을 학습 시키는 기능 등

다음 글은 RabbitMQ의 기능을 통해 프로듀서에서 MSSQL DB에 특정 값을 저장하고 컨슈머에서 저장된 값들을 출력하는 기능을 구현해보고자 합니다.

profile
Graduate student at Pusan National University, majoring in Artificial Intelligence

0개의 댓글