RabbitMQ 활용

Lungnaha·2022년 3월 21일
1

Cloud

목록 보기
9/9

💪 들어가며..

최근 MSA를 공부하면서 각각의 MicroService 간의 통신에 대해서 고민하였습니다.
그러다가 이 둘 간 통신을 도와주는 중간 브로커 역할을 수행해주는 RabbitMQ에 대해 알게되었습니다.
여기서 간단하게 RabbitMQ에 대해서 언급드리면, 여러 마이크로서비스 간에 DB의 변경 사항 등 통신을 통해 정보를 공유해야되는 상황이 생긴다는 것은 말로만 들어도 느껴지실 것입니다.
그 때, 직접적으로 통신하는 것이 아닌, 중간에 통신 브로커를 두고 정보를 공유할 수 있도록 해줄 수 있습니다.
브로커는 보내려는 메시지를 받고, 만약 통신의 목적지가 오프라인 이라면 이를 가지고 있다가 온라인 상황에 이를 보내는 역할을 수행해줍니다.
(쉽게 생각해서 Message Queue 정도로 느낌을 가지시면 될 것 같습니다.)

참고로 서비스 통신은 Rest API 같이 요청 후, 응답을 받을 때까지 대기하는 동기적 방법과, RabbitMQ 처럼 요청 후 응답을 기다리지 않고, 다른 것을 실행시키다, 응답이 오면 받는 비동기적 방식이 있습니다.

🐰 RabbitMQ 준비


저는 CludAMQP를 사용해서 RabbitMQ를 이용해보았습니다.
(귀여운 동물들이 아주 인상적인 사이트였습니다.)
해당 사이트에서 실습 용도로 서울 리전의 무료 인스턴스를 만들었습니다.
만든 후에는 인스턴스에 들어가서 아래 AMQP URL만 이용하면 됩니다.

🐹 Producer & Consumer 생성

이번 실습의 구조는 Docker로 실행시킨 Django 앱에서 생성한 메시지를 Docker로 실행시킨 Flask에서 받는 것을 확인해볼 수 있도록 구현하였습니다.

Producer

먼저 메시지를 전달하는 Producer를 Django 앱에 만들었습니다.

해당 코드에 대해 추가적인 설명을 하면,
params에 위에서 이용한다고 했던 AMQP URL을 적어서 파라미터로 만들고, connection을 통해 연결을 해줍니다.
그리고 channel에서 연결 통로를 만들고 생성한 publish() 를 통해서 메시지를 전달하게 됩니다.

코드 작성이 완료되면, views.py와 urls.py 를 수정해서 특정 url을 호출할 때, publish() 함수를 실행할 수 있도록 해줍니다.

Consumer

다음으로는 전달된 메시지를 받는 Consumer를 Flask에 만들었습니다.

해당 코드에 대해 추가적인 설명을 하면,
channel 까지는 위에 producer 와 동일한 코드입니다.
channel.queue_declare 에서 여러 브로커들 중, 메시지를 받기를 희망하는 브로커 이름을 적습니다.

그리고 메시지를 받으면 취할 callback() 함수를 작성해줍니다.
저는 실습을 위해 간단하게 print로만 구성된 코드를 작성했으나, 추후에는 프로젝트의 방향에 맞게 해당 부분을 수정하면 될 것입니다.

basic_consume으로 어디서 메시지를 받았을 때, 어떤 callback 함수를 이용할지 지정해줄 수 있습니다.

구조

참고로 구조에 대해서 잠깐 설명드리겠습니다.
producer의 경우에는 Django의 앱 마다 전달하고 싶은 메시지가 다를 것이고, 그로 인해 브로커를 따로 설정할 수 있어야 하므로, 특정 앱 안에 위치시켰습니다.
consumer의 경우에는 Flask 전체에서 메시지를 받을 수 있도록 파일을 위치시켜주었습니다.
물론, 해당 구조를 반드시 따라야하는 것은 아니므로 참고만 하시고 프로젝트의 상황에 맞게 구조를 맞추면 됩니다.

🦝 통신 실습

이제 통신을 위한 기본적인 준비를 완료되었습니다.
해당 통신을 확인하는 실습 방법은 아래와 같습니다.

  1. Docker를 이용해서 Django와 Flask 를 실행시켜줍니다.
  2. 아래의 코드를 통해 Flask 내부에 들어갑니다.
docker-compose exec backend sh
  1. Flask 내부에서 아래의 코드를 통해 메시지를 받을 수 있도록 consumer를 실행시켜줍니다.
python consumer.py
  1. Django 앱에 알맞은 url을 접속해서 publish() 함수가 실행될 수 있도록 해줍니다.

위의 과정대로 실습을 진행하면 아래와 같이 Flask 에서 메시지를 받은 것을 확인할 수 있습니다.

profile
Long🌈Now😁Happy💖

0개의 댓글