[Docker] RabbitMQ 설정

728x90

안녕하세요

오늘은 RabbitMQ 를 Docker에 깔아보겠습니다.

 

왜 RabbitMQ 를 사용하게 되었냐면, 강의를 들으면 공부를 하던 중

동기 통신이 아닌, 비동기 통신을 해야 하는 상황이 있었습니다. 

 

그래서 비동기 통신을 하기 위해 메세지 큐를 사용해야 했고, 

메세지 큐 중 하나인 오픈소스인 RabbitMQ 를 사용했습니다.

 

설정에 대해 알아보기 전에 간단하게 RabbitMQ 에 대하여 알아보겠습니다. 

 

비동기 처리를 위한 메세지 큐에는 어떤 것이 있을까요?

  1. RabbitMQ
  • 메시지 브로커는 송신자와 수신자 간의 효율적인 메시지 전달을 중개하는 역할을 담당 합니다.
  • AMQP 를 기반으로 작동하며, 대규모 분산 시스템에서 사용되는 메시지 큐 서비스를 제공한다.
  • 프로듀서(메세지 생성) 와 컨슈머(메세지 소비) 간의 비동기적인 통신을 용이하게 한다.
  • 프로듀서는 메세지를 RabbitMQ에 보내고, RabbitMQ 는 이를 큐에 저장합니다.
    • 그런 다음 컨슈머는 큐에서 메시지를 가져와 처리할 수 있다.

RabbitMQ 는 여러 어플리케이션 간의 통신을 향상시키고, 비동기 처리를 지원하여 시스템의 확장성과 유연성을 높인다.

또한 RabbitMQ 는 다양한 기능을 제공하여 메시지 라우팅, 메시지 필터링, 우선순위 지정 등의 작업을 수행

 

RabbitMQ 는 많은 프로그래밍 언어와 통합이 가능하며, 다양한 플랫폼에서 사용할 수 있습니다.

이를 통해 분산 시스템, MSA 아키텍쳐, 이벤트 기반 시스템 등에서 메시지 기반 통신을 구현할 수 있다.

 

그 외 AMQP, QUEUE 등등이 있습니다.

 

이제 인텔리제이 에서 설정을 해보겠습니다. 제 프로젝트 환경은 SpringBoot3.2 버전 입니다.

 

 

application.yml

version: '3.7'
services:
  rabbitmq:
    image: rabbitmq:latest
    ports:
      - "5672:5672" # rabbit amap port
      - "15672:15672" # manage port
    environment:
      - RABBITMQ_DEFAULT_USER=admin # 기본 사용자
      - RABBITMQ_DEFAULT_PASS=1234!@ # 기본 사용자 비밀번호

 

원하는 경로에  파일을 만든 후 위 코드를 작성합니다. 

보통 RabbitMQ 라는 디렉토리를 만들고 그 안에 설정을 합니다.

 

그리고 실행을 시킵니다. 참고로 실행은

1) 터미널

2) 인텔리제이 자체 실행

이 있고 저는 인텔리제이 자체에서 실행을 시켰습니다. 

 

에러 없이 잘 실행이 되면 이제 Docker 어플리케이션을 들어갑니다.

그렇다면 본인이 설정한 포트랑 이름이 잘 실행이 되었다면 이제 도커 터미널을 들어갑니다.

빨간색 원 을 클릭하고  Open in teriminal 이 있을 겁니다.

 

그리고 터미널에서 아래 명령어를 입력합니다.

 

  1. 매니지먼트 활성화 명령어 입력
rabbitmq-plugins enable rabbitmq_management 

위 명령어를 입력한 후에

인터넷 브라우저에서 내가 설정한 포트로 접속이 되는지 확인한다.

 

 

그리고 위 창에서 yml 파일에 설정한, 아이디랑 비밀번호로 로그인이 되는지 체크를 한다.

 

 

로그인이 정상적으로 되면 위 화면이 나오게 될 것 입니다.

위 화면은 RabbitMq 매니지먼트 대쉬보드 입니다.

 

위 대쉬보드에서 Queue를 생성할 수도 있고, 현재 어떤 서버가 커넥션 되어 있는지, exchange 어떤 것들이 있는지 볼 수 있습니다.

 

 

마지막으로 제가 사용하는 프로젝트에서 RabbitMQ 아키텍쳐 에 대한 이야기를 해보겠습니다.

 

 

 

간단하게 제가 공부해보고 있는 아키텍쳐에, rabbitMQ 를 적용한 아키텍쳐 입니다.

 

이벤트 메시지 기반 에서는 당연하게도 이벤트를 발생시키는 쪽이 있어야 합니다.

→ 즉 Publisher 가 존재해야 합니다.

 

1) Publisher가 주문을 넣게 되면은 해당 주문에 대한 이벤트를 발생 시킵니다.

 

2) Publisher 주문을 바로 서버에 있는 queue에 보내는게 아닌

Exchange 에 메세지를 집어넣게 됩니다.

 

3) exchange 을 역할은 요청받은 이 메세지들을 어디로 라우팅을 시킬까,

즉 어디로 보낼지 결정을 하는 곳 입니다.

MVC 구조로 빗대면 컨트롤러의 역할이라고 생각하면 됩니다.

 

4)  exchange가 특정한 queue에 다가 메시지를 넣어준다.

 

queue에다가 특성을 줄 수도 있고, 딜레이 시간도 줄 수 있고, 여러가지 효과를 줄 수 있습니다.

 

Publisher 가 있으면 당연히 Consumer 가 존재해야 합니다.

 

Queue을 메시지를 Consumer 쪽이 꺼내와서 데이터를 처리를 합니다.

 

Consumer 는 데이터를 Queue에 밀어넣을 수도 있고, 꺼낼 수도 있다

→ 즉 양방향 통신이 가능하다.

 

또는 붙어서만 데이터를 처리하는 컨슈만 하는 역할을 할 수도 있다.

위 역할을 본인이 어떻게 설정하냐에 따라 다르다.

 

위 아키텍쳐 구조 간단 설명

  1. Publisher 가 Message 를 Exchange 에다가 집어 넣는다.
  2. Exchange 는 특정 Queue 에 다가 라우팅을 해준다.
  3. Queue 에 메세지가 담긴다.
  4. Consumer 가 Queue 에서 데이터를 가져와서 사용한다.

 

이상입니다. 나중에 더 공부를 하고 추가 된 내용과 수정 된 내용을 포스팅 하겠습니다. 

 

728x90