Message Queue (MQ)

곽태민·2023년 7월 26일
0

TIL

목록 보기
32/65
post-custom-banner

Message Queue


Message Queue는 프로세스 또는 프로그램 간에 데이터를 교환할 때 사용하는 통신 방법 중 하나로, 메시지 지향 미들웨어 (Message Oriented Middleware: MOM) 를 구현한 시스템을 의미한다.

메시지 지향 미들웨어란?
비동기 메시지를 사용하는 응용 프로그램들 사이에서 데이터를 송수신하는 것을 의미한다.

여기서 메시지는 요청, 응답, 오류 메시지나 단순한 정보 등의 작은 데이터가 될 수 있다.

메시지 큐는 메시지를 임시로 저장하는 간단한 버퍼라고 생각하면 되고, 메시지를 전송 및 수신하기 위해 중간에 메시지 큐를 둔다.

메시지 전송 시 생산자(Producer) 로 취급되는 컴포넌트가 메시지를 메시지 큐에 추가한다. 해당 메시지는 소비자(Consumer) 로 취급되는 또 다른 컴포넌트가 메시지를 검색하고 이를 사용해서 어떤 작업을 수행할 때까지 메시지 큐에 저장 된다.

각 메시지는 하나의 소비자에 의해서 한 번만 처리될 수 있는데, 이러한 이유로 메시지 큐를 이용한 방식을 일대일통신이라고 부른다.

Message Queue를 사용하는 경우

일반적인 서버-클라이언트 구조에서는 클라이언트가 요청을 하면 서버는 그에 대한 처리를 한 후 클라이언트에게 응답을 한다. 간단한 서버 구조일 경우는 굳이 메시지 큐를 사용할 필요가 없다.

사용자가 응답을 기다려야하는 경우, HTTP 요청을 바로 처리하지 않고 중간에 메시지 큐를 두는 경우는 바람직하지 않다.

또한, 메시지 큐를 적용하려면 다양한 메시지 큐 중에서 시스템의 목적에 맞는 것을 선정해야한다. 이후 선정된 메시지 큐의 사용방법을 익혀 지원하는 다양한 옵션 중에 시스템이 추구하는 옵션을 설정해야 한다.

메시지 큐는 소비자(Consumer)가 실제로 메시지를 어느 시점에 가져가서 처리하는지 보장하지 않는다. 언젠가 큐에 넣어둔 메시지가 소비되어 처리가 될 거라고 믿는 것이다.

이러한 비동기적 특성때문에 메시지 큐는 실패하면 치명적인 핵심 작업보다는 어플리케이션의 부가적인 기능에 사용하는 것이 적합하다.

이메일 전송

어떤 웹 사이트의 비밀번호를 잊어버려서 임시 비밀번호를 받거나, 새로운 회원가입을 위한 인증 코드를 보내는 이메일 서비스는 어느정도의 응답 지연이 허용되고, 어플리케이션의 핵심 기능이 아니므로 메시지 큐를 사용할 수 있다.

  • ex) 비밀번호 재설정을 위해 이메일을 발급하는 서비스, 회원가입을 위해 이메일을 발급하는 서비스 등

이메일 전송 전용 서비스는 이메일이 어느 서비스로부터 생산되었는지와 관계없이, 메시지 큐의 메시지를 하나씩 소비하고, 그저 이메일이 전송되어야 할 곳으로 이메일을 전송한다.

메시지 큐에 들어오는 메시지 수가 많아지는 경우 이메일 전송 전용 서비스 인스턴스를 더 두기때문에 확장을 할 수 있다. -> 확장성이 뛰어남

블로그 포스팅

모든 블로그 사용자가 웹에 최적화가 되어 있거나, 용량이 작은 이미지만 업로드를 하지 않는다.

블로그 사용자가 서비스 응답 시간을 저해하지 않으면서 사용자들에게 유연성을 제공하는 방법으로, 사용자가 업로드한 모든 이미지를 게시하는 과정에서 즉각 처리가 아닌 사후 처리로 최적화 할 수 있다.

  1. 사용자가 고용량의 이미지를 포함하여 블로그를 포스팅한다.
  2. 이미지는 저장소에 전송된다.
  3. 업로드된 이미지에 대한 정보가 포함된 메시지를 이미지 최적화 서비스의 메시지 큐에 담는다.
  4. 이미지 최적화 서비스는 저장소에서 이미지를 가져와 최적화 후 이미지를 대체한다.

Message Queue 장점

1. 비동기 (Asynchronous)

메시지 큐는 생산된 메시지의 저장, 전송에 대해 동기화 처리를 진행하지 않고, 큐에 넣어두기 때문에 나중에 처리할 수 있다. 여기서 기존 동기화 방식은 많은 메시지를 전송할 경우 병목 현상이 생길 수 있고, 뒤에 들어오는 요청에 대한 응답이 지연될 것이다.

2. 낮은 결합도 (Decoupling)

생산자 서비스소비자 서비스가 독립적으로 행하면서 서비스간 결합도가 낮아진다.

3. 확장성 (Scalable)

생산자 서비스 혹은 소비자 서비스를 원하는대로 확장할 수 있기 때문에 확장성이 좋다.

4. 탄력성 (Resilience)

소비자 서비스가 다운되더라도 어플리케이션이 중단되는 것이 아니라 메시지는 메시지 큐에 남아있다. 소비자 서비스가 다시 시작될 때마다 추가설정이나 작업을 수행하지 않아도 메시지 처리를 시작할 수 있다.

5. 보장성 (Guarantees)

메시지 큐는 큐에 보관하는 모든 메시지가 결국 소비자 서비스에게 전달된다는 일반적인 보장을 제공한다.

profile
Node.js 백엔드 개발자입니다!
post-custom-banner

0개의 댓글