본문 바로가기
Back-end/RabbitMQ

[RabbitMQ] 무작정 시작하기 (2) - Publish/Subscribe

by 허도치 2020. 1. 8.

이 포스트는 Windows 10, Python 3.7.4 를 기준으로 작성되었음.

 

 

2020/01/08 - [Back-end/RabbitMQ] - [RabbitMQ ] 무작정 시작하기 (1) - 설치 및 실행

 

  지난 포스트에서는 RabieMQ Server를 설치하고 설정하고 실행까지 해보았다. 이번 포스트에서는 Python의 RabbitMQ라이브러리인 pike를 이용하여 Message를 주고 받는 방법을 다룰것이다. Message를 전송(Publish)하는 송신자를 주로 Producer라고 하며, Message를 받는(Subscribe) 수신자를 주로 Consumer라고 한다.

 

 

1. 라이브러리 설치.

   1-1. pika 1.1.0 버전 설치.

         - pip install pika==1.1.0

 

2. Consumer 생성 및 실행.

   2-1. consumer.py 작성.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import pika
 
queue = 'heo_queue'
 
# RabbitMQ Server Connection 생성
connection  = pika.BlockingConnection(pika.URLParameters('amqp://heo:heo@localhost:5672/'))
 
# RabbitMQ Server와 통신하기 위한 channel 생성
channel = connection.channel()
 
# Message Queue 생성
# Consumer가 먼저 실행될 경우 접근할 Queue가 없기 때문에 생성
channel.queue_declare(queue=queue)
 
# 메시지를 받으면 실행할 task(함수)를 정의합니다.
def callback(ch, method, properties, body):
    print(" [x] Received %r" % body)
    ch.basic_ack( delivery_tag=method.delivery_tag )
 
# consumer로 설정하여 queue로 부터 메시지를 받아 task를 수행할 수 있도록 합니다.
# channel.basic_qos(prefetch_count=1)
channel.basic_consume( queue, callback )
 
print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()
cs

 

   2-2. Consumer 실행.

         - 명령 프롬프트를 실행 한 후 명령어 입력.

         - python consumer.py

         - 정상적으로 실행되면 사진과 같은 문구가 출력되며 대기 상태가 됨.

 

 

3. Producer 생성 및 실행.

   3-1. producer.py 작성.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import sys
import pika
 
queue = 'heo_queue'
message = ' '.join(sys.argv[1:])
 
# Connection 생성
connection = pika.BlockingConnection(pika.ConnectionParameters(
                host='localhost'
                , port=5672
                , virtual_host='/'
                , credentials=pika.PlainCredentials('heo''heo')   # username, password
            ))
 
# Server와 통신하기 위한 channel 생성
channel = connection.channel()
 
# Message Queue 생성
channel.queue_declare(queue=queue)
 
# Message 전송
channel.basic_publish(
    exchange=''             # 다른 Queue로 Routing하는 역할
    , routing_key=queue     # Message를 적재할 Queue
    , body=message          # 전송할 Message
)
print(" [x] Sent " + message )
 
# Connection 종료
connection.close()
cs

 

   3-2. Producer 실행

         - 명령 프롬프트를 실행 한 후 명령어 입력.

         - python producer.py <보낼 메시지를 입력>

         - Producer는 실행되면 메시지가 전송되면서 바로 종료됨.

 

   3-3. Consumer 확인.

         - Producer가 보낸 메시지가 출력되는 것을 볼 수 있음.

 

 

4. Queue 상태 확인.

   4-1. 관리페이지 접속.

         - http://localhost:15672

 

   4-2. Queue 탭으로 이동.

 

   4-3. 자신이 생성한 Queue를 선택.

         - 이 화면에서 현재 Queue에 적재된 Message의 흐름을 알 수 있음.

 

     4-4. Queue의 상태 확인.

         - Consumer를 종료하고 Producer로 메시지를 계속 보내면 아래와 같이 Ready의 값이 증가함.

 

         - 다시 Consumer를 실행하면 Message가 모두 소비되는 것을 볼 수 있음.

 

 

5. 마치며

   - 이번 포스트에서는 간단하게 Producer와 Consumer를 생성하고 메시지를 주고받는 방법에 대해서 알아보았다. RabbitMQ는 Celery를 위한 하나의 수단이라 이정도만 다루어도 충분하다고 생각한다.

   - 좀 더 깊게 공부하려면 Exchages와 Virtual Host를 필히 학습하길 바란다.

 

 

참고사이트

- https://pika.readthedocs.io/en/stable/examples.html

- https://nesoy.github.io/articles/2019-02/RabbitMQ

댓글