What is Message Queue?
- 메시지 큐는 프로세스 또는 프로그램 간에 데이터를 교환할 때 사용하는 통신 방법 중의 하나
- 메시지 큐를 이용해서 메시지 지향 미들웨어(Message Oriented Middleware, MOM)를 구현할 수 있으며, MSA에서 중요한 서비스 간 통신(Inter-Process Communication, IPC)을 가능하게 한다.
- 대표적인 메시지 큐에는 [ic]Kafka[/ic], [ic]RabbitMQ[/ic], [ic]ActiveMQ[/ic] 등이 있다.
How it works?
- 메시지 큐는 임시로 메시지를 저장하고 있는 공간이라 이해하면 된다. 서비스가 메시지를 전송 및 수신하기 위해 중간에 전달자 역할을 하는 큐 형태의 자료구조이다.
- 메시지 전송 시 생산자(Producer)로 취급되는 컴포넌트가 메시지를 큐에 추가한다. 해당 메시지는 소비자(Consumer)로 취급되는 컴포넌트가 메시지를 검색하고 이를 사용해 어떤 작업을 수행할 때까지 메시지 큐에 저장된다.
- 각 메시지는 하나의 소비자에 의해 한 번만 처리될 수 있는 특징을 가지고 있어, 메시지 큐를 이용하여 통신하는 방식을 일대일 통신이라 한다.
- 메일을 전송하는 MSA가 있다고 했을 때, 큐에 쌓인 요청에 따라 메일을 전송하도록 하여 독립적이고 확장성을 갖춘 서비스를 설계할 수 있다.
Advantages
- 비동기성(Asynchronous): 생산된 메시지의 저장, 전송에 대해 Queue에 넣어두기 때문에 비동기 통신이 가능하다. 동기적 통신보다 더 많은 데이터 처리가 가능해진다.
- 낮은 결합도(Decoupling): 서비스 간의 통신에 따라 생산자 서비스와 소비자 서비스가 독립적으로 행동할 수 있게 된다.
- 확장성(Scalable): 다수의 프로세스가 큐에 메세지를 전송할 수 있다.
- 탄력성(Resilience): 서비스 어플리케이션이 중단 되더라도 메시지 큐는 정상 동작한다. 서비스가 다시 정상 작동하게 되면 추가 설정이나 작업 없이 메시지 처리를 시작할 수 있다.
- 보장성(Guarantees): 메시지가 결국 소비자 서비스에 전달되는 것이 보장되며, 작업 처리 결과를 확인할 수 있다.
Message System with NestJS
- NestJS 프레임워크에서 MSA를 위한 서비스 간 메시지 전송을 위해 여러 전송 계층을 지원한다.
- TCP 기반의 통신 뿐만 아니라, Redis, MQTT, NATS, RabbitMQ, Kafka 등 다양한 전송 계층을 지원한다.
RabbitMQ Tutorial
Producer에서 전송한 문자열로 이루어진 메시지를 받아서 Consumer에서 출력하는 Tutorial을 진행해보자.
Install RabbitMQ
Downloading and Installing RabbitMQ — RabbitMQ
Downloading and Installing RabbitMQ The latest release of RabbitMQ is 3.11.2. See change log for release notes. See RabbitMQ support timeline to find out what release series are supported. Experimenting with RabbitMQ on your workstation? Try the community
www.rabbitmq.com
rabbitmq - Official Image | Docker Hub
Quick reference Supported tags and respective Dockerfile links 3.11.2, 3.11, 3, latest 3.11.2-management, 3.11-management, 3-management, management 3.11.2-alpine, 3.11-alpine, 3-alpine, alpine 3.11.2-management-alpine, 3.11-management-alpine, 3-management-
registry.hub.docker.com
- RabbitMQ 홈페이지 문서를 보면 다양한 설치 방법에 대해서 나와있다. 로컬 환경에서 브로커 인스턴스를 생성하기 위해, 도커를 활용해서 다운 받아 보자.
- 도커 이미지를 다운 받고, 도커 컨테이너를 실행시키면 로컬 환경에서 RabbitMQ 메시지 브로커 인스턴스를 활성화 할 수 있다.
- 처음 입력한 포트 정보는 메시지 큐에 접근하기 위한 포트이고, 다음으로 입력한 포트는 어드민 페이지 접속을 위한 포트 정보이다.
AWS에서 클라우드 환경으로 메시지 브로커를 관리할 수 있는 Amazon MQ 서비스를 제공하고 있다. 현재 [ic]Apache AtiveMQ[/ic]와 [ic]RabbitMQ[/ic] 두 가지 메시지 브로커를 지원한다.
Dependencies
- [ic]@nestjs/microservices[/ic] → [ic]@nestjs/core[/ic]와 버전이 다를 경우 에러 발생 주의!
- [ic]amqplib[/ic], [ic]amqp-connection-manager[/ic]
- 위의 패키지들은 통신에 포함된 양쪽 Application에 모두 설치가 되어야한다.
Producer Application - e.g. Payment Application
- 패키지 설치를 마쳤다면, 메시지를 생성하고자 하는 모듈에서 ClientModule을 이용해서 메시지를 보낼 RabbitMQ 인스턴스를 등록한다.
- [ic]register()[/ic] 함수 안의 configs 중에 options안의 urls 정보를 살펴보자. 브로커 인스턴스에 접근할 수 있는 url 정보가 필요하다. url 스키마는 [ic]protocol[/ic]://[ic]username[/ic]:[ic]password[/ic]@[ic]host[/ic]:[ic]port[/ic]/[ic]vhost[/ic] 형태로 구성된다. Protocol은 기본 AMQP 함께 AMQPS 형식도 지원한다.
- 앞서 AppModule에서 RabbitMQ 인스턴스를 등록할 때 사용했던 [ic]name[/ic] 을 활용하여 Controller 생성자에 ClientProxy 객체를 Inject한다.
- ClientProxy 객체는 [ic]send()[/ic] 함수를 통해서 메시지 브로커에 메시지를 전달할 수 있다. 이 함수는 연동된 Consumer를 호출하여 해당 Consumer가 응답한 결과를 관찰할 수 있는 [ic]Observable[/ic] 객체를 반환한다.
- [ic]send()[/ic] 함수는 pattern과 payload 두 가지 인자를 매개변수로 받는다. pattern은 전달하는 메시지에 tag를 붙이는 것과 같은 개념으로, Consumer는 pattern을 통해 메시지를 구독하게 된다. payload에는 Consumer에게 전달할 데이터를 담게 된다.
Consumer Application - e.g. User Application
- Nest Application을 생성하는 [ic]bootstrap()[/ic] 함수에서 추가 설정을 해야한다. 기본 HTTP 통신과 함께 AMQP 통신이 가능하게 하려면, @nestjs/microservices에서 제공하는 [ic]connectMicroservices()[/ic] 함수를 사용한다.
- 전송된 메시지를 수신하기 위해서 [ic]@MessagePattern()[/ic] 데코레이터를 사용한다. 데코레이터 매개변수로 특정 pattern을 지정함으로써 어떠한 메시지를 수신할 지 설정할 수 있다.
튜토리얼 끝!
References
Documentation | NestJS - A progressive Node.js framework
Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Progamming), FP (Functional Programming), and FRP (Functional Reac
docs.nestjs.com
메시지 큐에 대해 알아보자!
메시지 큐란 메시지 큐(Message Queue)는 프로세스 또는 프로그램 간에 데이터를 교환할 때 사용하는 통신 방법 중에 하나로, 메시지 지향 미들웨어(Message Oriented Middleware:MOM…
tecoble.techcourse.co.kr
메시지 큐(Message Queue / MQ)
메시지 큐(Message Queue 이하 MQ)란 프로세스(프로그램) 간에 데이터를 교환할 때 사용하는 통신 방법 중에 하나로 더 큰 개념으로는 MOM(Message Oriented Middleware : 메시지 지향 미들웨어 이하 MOM)를 의미
steady-snail.tistory.com
메시지 큐와 종류 그리고 비교
메시지 큐와 종류 그리고 비교
err0rcode7.github.io
'Backend > Network' 카테고리의 다른 글
자주 쓰이는 HTTP 상태코드 (0) | 2022.11.28 |
---|---|
RESTful한 API 설계하기 (1) | 2022.10.04 |
댓글