MQ, Message Queue

Ik·2023년 2월 26일
0

CS

목록 보기
9/27

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를 구현한 오픈 소스 MQ 중의 하나

AMQP(Advanced Message Queuing Protocol)

  • 서로 다른 프로세스 사양에 메시지 교환할 때 사용, 시스템 간 메시지를 교환하기 위해 공개 표준으로 정의한 프로토콜

프로세스

SENDER(PRODUCER) <=> Rabbit MQ <=> RECEIVER(CONSUMER)

PRODUCERBROKER에 Publish
BROKERRECEIVER에 CONSUME(요청)
RECEIVERBROKER에 SUBSCRIBE(반환)
PRODUCERPUBLISHER, PROVIDER라고도 불린다




Broker

  • Exchange와 Queues로 구성
  • Producer가 Broker에 요청을 보내는 작업을 Publish라 부르며 정확하게는 exchange 메세지를 보낸다고 말한다

Exchange

  • 4가지로 정해져 있는 규칙에 맞춰 메세지를 라우팅
  • exchange 과정을 통해 적절한 Queue에 Binding 한다

Binding

  • matching이라 생각하면 된다

Queues

  • Queue들의 모음으로 조건에 따라 사용되는 Queue의 종류가 다르다



구조

  • 회사 코드에는 listener, service, vo 3가지 구조로 되어 있었는데 이는
    • Listener : Queue에 있는 정보를 받아주는 역할
    • Service : 비즈니스 로직
    • vo : 비즈니스에 사용되는 객체
      으로 진행하는 것이라 예상된다






ref

0개의 댓글