Search
📒

9-1. RabbitMQ

RabbitMQ는 Message Broker의 일종입니다. Message Broker는 서로 다른 어플리케이션 간에 메시지를 주고받기 위한 중간 매게 역할을 하는 소프트웨어를 말합니다. 중간에 메시지를 검증을 하거나, 여러 대상에게 메시지를 보내는 등 다양한 역할을 할 수 있습니다.
특히 비동기 통신을 하는데 있어서 다양한 방법으로 활용되어, 여러 Worker(실제 데이터 처리를 담당하는 서버 또는 쓰레드)들에게 메시지를 분산해 전달하거나, 다양한 Subscriber(메시지를 듣기 위한 구독자 서버 또는 쓰레드)에게 동시에 메시지를 전달하는 역할을 하게 됩니다. 이런 형식의 메시지 전달 체계는 MSA(Micro Service Architecture)에 있어서 필수적인 요소로 여겨집니다.

메시지 기반의 비동기 통신

앞서 소개하면서 언급하였듯, 메시지 기반의 비동기 통신 기법은 다양한 형태로 이뤄질 수 있습니다. 그 중 대표적인 두가지만 살펴보겠습니다.

Job Queue

Message Queue를 활용해, 처리가 필요한 작업을 한곳에 쌓아두고, 처리를 할 수 있는 프로세스가 특정 규칙을 가지고 적재된 작업을 받아가는 방식으로 활용하는 방법입니다.
이때 Queue에 작업(Job)에 해당하는 메시지를 만드는 서버 / 프로세스를 Producer라고 부릅니다. 반대쪽에서 작업을 처리하기 위해 대기중인 서버 / 프로세스를 Consumer라고 부릅니다.
Job Queue를 구성하는 경우 일반적으로 Consumer에서 처리해야할 작업이 시간이 오래 걸리며, 내부적으로 Multithreading을 통한 작업처리가 불가능할 경우 Consumer 프로세스를 여럿 늘려가지고 비동기 병렬 처리하는 방식입니다.

Publish - Subscribe Message Pattern

동일한 정보를 여러 프로세스에 동시에 전달하는 메시지 패턴입니다.
이때, 발생하는 메시지를 듣기 위해 구독한다는 의미로 메시지를 전달받는 프로세스를 Subscriber, 메시지를 발생시키는 프로세스를 Publisher 라고 부릅니다.
Publish - Subscribe 패턴의 경우 여러 프로세스에 걸쳐 동일하게 알고 있어야 하는 메시지를 위해 사용하게 됩니다. 여러 서비스에서 사용자의 상태를 동시에 알고 있어야 하는 상황에서, 데이터베이스에 적재, 갱신하는 과정이 오래 소요될 때 많이 활용하는 방식입니다.
RabbitMQ는 Worker Queue와 Publish Subscribe Pattern을 구현하기 위한 방법이 다양하게 존재합니다. Job Queue의 작업이 특정 프로세스에 전달되는 순서의 기준(Round-Robin, Fair Dispatch), Pub-Sub 패턴의 메시지 중 일부만 구독하는 방식 등이 있습니다. 여기서는 가장 간단한 내용으로 실습을 진행합니다.

RabbitMQ 설치

MySQL과 마찬가지로 RabbitMQ 역시 Docker를 활용하면 간단히 설치할 수 있습니다.
# for RabbitMQ 3.8 docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management
Plain Text
복사
그 외에 설치하기 위해서는 RabbitMQ 홈페이지에서 인스톨러를 제공하고 있습니다.

RabbitMQ 기본

RabbitMQ 역시 관계형 데이터베이스 처럼 사용자 관리가 가능합니다. 기본으로 생성된 사용자는 guest 이며, 비밀번호 역시 guest 입니다. spring-boot-starter-amqp 의존성에 기본으로 설정된 아이디 비밀번호 역시 동일합니다. 다만 guest 계정으로는 localhost, 즉 자신의 컴퓨터에서만 접속이 가능합니다. 만일 외부 컴퓨터의 접근을 허용하려면 계정을 추가하고 설정을 해야합니다. 해당 내용은 지금은 진행하지 않습니다.

Queue

Message Broker는 일반적으로 Producer가 발생시킨 Message 순차적으로 적재하여, 흔히 자료구조에서 말하는 Queue의 형태로 정의합니다. RabbitMQ를 사용하는 어플리케이션은 이 Queue에 연결하여 메시지를 전달받게 됩니다.

Exchange

RabbitMQ의 Queue에 실제로 메시지를 적재하는 주체입니다. 즉 어플리케이션은 Queue에서 메시지를 받아온다면, Queue는 Exchange로부터 메시지를 전달받게 됩니다. Queue와 Exchange는 별개라고 볼 수 있으며, Queue랑 Exchange가 연결된 것을 binding이라고 부르게 됩니다.
Worker Queue를 구성하게 된다면, 메시지를 전달하기 위한 Exchange 하나와, 여러 어플리케이션이 연결되어 있는 Queue 하나로 구성하게 됩니다. Publish Subscribe 패턴을 구성하게 된다면, 하나의 Exchange에, 다양한 Queue가 Binding을 이루게 됩니다.