[NestJS] Redis Message Queue 구현해보기
Bull Queue를 이용한 메시지큐 튜토리얼
6 min readApr 10, 2021
- 사용 스택
- NestJS
- Typescript
- Redis
- Docker - 목표
- use Bull Queues
- use Redis
설치
NestJS는 기본으로 @nestjs/bull을 제공합니다.
기존 Bull Queue를 Nest적인 방식으로 애플리케이션에 쉽게 통합할 수 있습니다.
$ npm i -g @nestjs/cli
$ nest new nest-redis
$ cd nest-redis
- nestjs/cli 설치 후 nest-redis라는 새로운 프로젝트를 생성합니다.
$ npm install --save @nestjs/bull bull
$ npm install --save-dev @types/bull
- nestjs에서 제공하는 bull를 설치합니다.
도커 파일 생성 및 설정
- Dockerfile, docker-compose.yml를 생성해둡니다.
#Dockerfile
FROM node:14RUN mkdir -p /app
WORKDIR /app COPY ./ /appRUN yarn installEXPOSE 3000CMD ["node", "dist/main"]# docker-compose-yml
version: '3.1'
services:
redis-server:
image: redis
container_name: redis-server
hostname: redis-server
ports:
- '6379:6379' api-server:
build:
dockerfile: Dockerfile
context: ./
container_name: api-server
ports:
- '3000:3000'
depends_on:
- redis-server
- docker-compose up 명령어를 통해 실행 가능합니다.
BullModule 등록
- app.module.ts에 다운받은 Bull Module을 import 합니다.
- 추가적으로 큐의 이름을 ‘testQueue’로 지정하여 등록합니다.
AppController / AppService
- AppController에 number 타입의 data를 입력받아 queue에 추가하는 API를 생성합니다.
- InjectQueue() 데코레이터를 통해 큐를 추가합니다. app.module.ts에서 BullModule.registerQueue()를 통해 등록했던 큐 이름으로 작성합니다.
- add() 메소드를 사용하여 해당 큐에 데이터를 넣습니다.
- add(작업명, 값)
API 테스트
- Postman을 통해 테스트 해본 결과입니다. task란 작업명으로 데이터가 정상적으로 추가되었습니다.
작업 옵션 (delay)
- 추가적으로 add(작업명, 값, 옵션) 이런식으로 옵션을 추가할 수 있습니다. 옵션 중에서 delay (milliseconds) 를 통해 딜레이를 줄 수 있습니다.
- 딜레이 시간만큼 대기한 후 작업을 처리하게 됩니다.
ex. “이건 지금 처리할게 아닌데… 3초 뒤에 처리해줘!” - 이외에도 많은 작업 옵션들이 존재합니다. (https://docs.nestjs.com/techniques/queues)
Consumer (소비자)
- 이제 작업을 등록했으니 작업을 처리할, 수신할 클래스를 생성하겠습니다.
- Processor 데코레이터를 통해서 수신할 큐 이름을 지정합니다.
Process 데코레이터를 이용해서 수신할 작업 명을 지정합니다.
수신 후, 해당 데이터를 Logger로 출력할 수 있게 코드 작성했습니다. - app.module.ts의 providers에 AppConsumer를 추가해줍니다.
- postman으로 api를 요청하면 3초 뒤에 Logger가 찍히는 것을 볼 수 있습니다.
- ecs 상에서 하나의 redis 서버를 두고 작업을 진행할 때도 문제없습니다.
- Consumer(소비자)는 해당 메시지 큐 수신 작업을 나눠서 진행하게 됩니다.
- 메시지큐 추가 작업을 for문을 통해 여러개를 추가한 후 postman으로 요청을 보냅니다.
- Consumer가 사이좋게 나눠 작업을 수신하는 것을 볼 수 있습니다!