[RabbitMQ #4] 경쟁 소비자 패턴(Competing Consumer Pattern)

2022. 2. 18. 20:472018년 이전 관심사/통신프로토콜

반응형

경쟁 소비자 패턴(Competing Consumer Pattern)

  • 여러 소비자가 동시에 메시지 큐에 있는 메시지를 처리 할 수 있도록 하는 설계 패턴
    • 사용량이 많은 시스템에서 요청으로 인한 병목 현상을 피하기 위해 소비자 사이에서 부하를 분산 함
  • 다수의 메시지를 분산 처리 하기 위한 환경에 적합
  • 수신을 위한 서비스가 여러 메시지를 동시에 처리 할 수 있도록 다수의 경쟁 소비자를 단일 채널에 생성
  • 송신자가 메시지를 메시지 큐에 전달하면, 소비자 중에서 하나의 수신자가 메시지 수신

 

Consumer( consumer.py )

connection = pika.BlockingConnection(pika.URLParameters('amqp://admin:admin@192.168.0.3:5672/'))
    
channel = connection.channel()
channel.queue_declare(queue='hello')

def callback(ch, method, properties, body):
    print(" [x] Received %r" % body.decode())
    time.sleep(body.count(b'.'))
    print(" [x] Done")

channel.basic_consume(queue='hello', on_message_callback=callback, auto_ack=True)

print("메시지를 기다리고 있습니다. 종료하려면 CTRL+C를 누르세요.")
channel.start_consuming()

Publisher( publisher.py )

import pika

connection = pika.BlockingConnection(pika.URLParameters('amqp://admin:admin@192.168.0.3:5672/'))
channel = connection.channel()


for i in range(10):
    channel.basic_publish(exchange='', routing_key='hello', body=str(i))
    print('# 메시지를 보냈습니다!' + str(i))

connection.close()

 

테스트 실행

총 3개의 Command 창을 열고, consumer.py를 2개의 Command 창에서 각각 수행 한다.

2개의 Command 창에서는 RabbitMQ Server로 부터 데이터 수신을 기다리고 있으며, publisher.py를 수행하면 아래와 같이 Consumer에서 부하로 데이터를 수신 하지 못할 때, 다른 Consumer에서 데이터를 수신 하는 것을 볼 수 있다.

 

$ python publisher.py
# 메시지를 보냈습니다!0
# 메시지를 보냈습니다!1
# 메시지를 보냈습니다!2
# 메시지를 보냈습니다!3
# 메시지를 보냈습니다!4
# 메시지를 보냈습니다!5
# 메시지를 보냈습니다!6
# 메시지를 보냈습니다!7
# 메시지를 보냈습니다!8
# 메시지를 보냈습니다!9
$ python consumer.py
메시지를 기다리고 있습니다. 종료하려면 CTRL+C를 누르세요.
 [x] Received '0'
 [x] Done
 [x] Received '2'
 [x] Done
 [x] Received '4'
 [x] Done
 [x] Received '6'
 [x] Done
 [x] Received '8'
 [x] Done
$ python consumer.py
메시지를 기다리고 있습니다. 종료하려면 CTRL+C를 누르세요.
 [x] Received '1'
 [x] Done
 [x] Received '3'
 [x] Done
 [x] Received '5'
 [x] Done
 [x] Received '7'
 [x] Done
 [x] Received '9'
 [x] Done

 

 

참고 자료

http://www.msaschool.io/operation/architecture/architecture-four/

https://www.rabbitmq.com/tutorials/tutorial-two-python.html

 

반응형