회사에 입사하고 사내에서 사용하는 툴들을 익혀야하기 때문에 velog를 시작했다. 이렇게 기록해두면 회사에서 삽질(?)도 덜하고 업무 효율이 조금이나마 오르지 않을까...!
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 설치를 간단히 요약하면 다음과 같다.
- Erlang 설치
- RabbitMQ 설치
- RabbitMQ 환경변수 설정
유의사항
Erlang은 사용할 RabbitMQ 버전과 호환되는 버전을 설치해야함.
이 세 과정을 통해 로컬 환경에서 RabbitMQ를 실행할 수 있다.
rabbitmq-plugins enable rabbitmq_management
cmd 창에 다음 명령어를 입력하여 플러그인을 활성화 할 수 있다.
설정된 것을 확인하려면
rabbitmq-plugins list
해당 명령어를 실행하여 E ,e 표시가 된 것을 확인할 수 있다.
명령을 사용하여 RabbitMQ 관리 플러그인을 활성화하면 웹 기반 관리 도구를 사용하여 RabbitMQ 서버를 모니터링, 관리, 유지 관리할 수 있으며, 사용자 및 권한 설정, 통계 및 모니터링 데이터 접근 등을 수행할 수 있다.
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가 동작하는 원리에 대해 알아보자.
파이썬에서는 pika라는 라이브러리를 통해 RabbitMQ를 사용할 수있다.
pip install pika
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 를 통해 선언했던 큐 이름이 등록된 것을 확인할 수 있다.
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의 기능을 통해 프로듀서에서 MSSQL DB에 특정 값을 저장하고 컨슈머에서 저장된 값들을 출력하는 기능을 구현해보고자 합니다.