MQ, message queue
- MOM을 구현한 시스템을 MQ라 부른다
- 프로그래밍에서의 MQ는 프로세스 또는 프로그램 인스턴스가 메시지를 포함한 데이터를 서로 교환할 때 사용
- MSA 구조로 운영하다보면 Server to Server로 메세지를 주고받아야할 때 존재
- 요청 시간이 길 때, 요청을 많은 사용자에게 전달할 때, 많은 작업이 요청되어 처리를 해야될 때, ex) 영상을 가져오는데 사용되는 것이라 예상된다
MOM, Message Oriented Middleware
- 비동기 메시지를 사용하는 다른 응용 프로그램 사이에서 데이터 송수신하는 것을 의미
- 버퍼(Buffer) 역할이라 생각하면 된다
- 데이터를 한 곳에서 다른 한 곳으로 전송하는 동안 일시적으로 그 데이터를 보관하는 메모리의 영역
- Buffer = Queue
배경
- 어플리케이션은 요청을 하고 응답을 하며 시스템이 운영된다
간단한 예로 App <=> DB 구조에서 App은 DB에 요청을 구하고 응답을 기다리다 응답을 받으며 시스템이 운영된다
- 순차적으로 App은 DB로부터 응답을 받아야만 응답이 가능하며 DB가 한번에 처리할 수 있는 명령어의 양은 제한적이기에 만약 서버가 매우 큰 경우 DB가 할당할 수 있는
양을 넘어 시스템 장애가 발생할 수 있어 이를 염두해두고 설계를 진행해야 한다
만약 DB 명령어 허용 용량 초과 발생하는 경우 모든 명령을 수행할 수 없는 상황이 발생할 수 있다
- MQ를 이용하면 DB의 응답을 기다리지 않고 요청을 보낼 수 있으며 DB의 제한적인 처리량 제어 가능
- 단순히 요청하는 종류가 많아졌다라는 것도 이유가 되지만 이미지, 비디오 인코딩, 대용량 데이터 처리 등과 같이 메모리와 CPU를 많이 사용하는 작업들의 경우도 마찬가지
- 요청을 계속 보낼 수 있다는 의미이며 실질적으로 요청은 DB로 가는 것이 아닌 MQ로 간다
- DB가 요청받았던 명령어들을 처리해 추가 명령어를 받을 수 있는 경우 MQ로부터 명령어를 받아와 처리한다
- MQ가 무너지면 소용 없는 구조이지만 많은 MQ는 고가용성을 위해 클러스터링 등을 지원
구성
- Producer, Customer로 구성
- 메세지를 보내는 서버(producer), 받는 서버(consumer)
- Customer가 MQ의 메세지를 처리하는 구조
- 위에 예에서는 Producer = App, Customer = DB
- 만약 Customer 서버가 다운되더라도 Producer의 명령은 MQ에 정상적으로 요청된다
RabbitMQ
AMQP(Advanced Message Queuing Protocol)
- 서로 다른 프로세스 사양에 메시지 교환할 때 사용, 시스템 간 메시지를 교환하기 위해 공개 표준으로 정의한 프로토콜
프로세스
SENDER(PRODUCER) <=> Rabbit MQ <=> RECEIVER(CONSUMER)
PRODUCER
는 BROKER
에 Publish
BROKER
는 RECEIVER
에 CONSUME(요청)
RECEIVER
는 BROKER
에 SUBSCRIBE(반환)
PRODUCER
는 PUBLISHER
, PROVIDER
라고도 불린다
Broker
- Exchange와 Queues로 구성
- Producer가 Broker에 요청을 보내는 작업을 Publish라 부르며 정확하게는 exchange 메세지를 보낸다고 말한다
Exchange
- 4가지로 정해져 있는 규칙에 맞춰 메세지를 라우팅
- exchange 과정을 통해 적절한 Queue에 Binding 한다
Binding
Queues
- Queue들의 모음으로 조건에 따라 사용되는 Queue의 종류가 다르다
구조
- 회사 코드에는 listener, service, vo 3가지 구조로 되어 있었는데 이는
- Listener : Queue에 있는 정보를 받아주는 역할
- Service : 비즈니스 로직
- vo : 비즈니스에 사용되는 객체
으로 진행하는 것이라 예상된다
ref