[NestJS] Redis Message Queue 구현해보기

Bull Queue를 이용한 메시지큐 튜토리얼

Donnis Dev-note
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:14
RUN 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 합니다.
app.module.ts
  • 추가적으로 큐의 이름을 ‘testQueue’로 지정하여 등록합니다.
app.module.ts

AppController / AppService

app.controller.ts
  • AppController에 number 타입의 data를 입력받아 queue에 추가하는 API를 생성합니다.
app.service.ts
  • InjectQueue() 데코레이터를 통해 큐를 추가합니다. app.module.ts에서 BullModule.registerQueue()를 통해 등록했던 큐 이름으로 작성합니다.
  • add() 메소드를 사용하여 해당 큐에 데이터를 넣습니다.
    - add(작업명, 값)

API 테스트

  • Postman을 통해 테스트 해본 결과입니다. task란 작업명으로 데이터가 정상적으로 추가되었습니다.

작업 옵션 (delay)

  • 추가적으로 add(작업명, 값, 옵션) 이런식으로 옵션을 추가할 수 있습니다. 옵션 중에서 delay (milliseconds) 를 통해 딜레이를 줄 수 있습니다.
  • 딜레이 시간만큼 대기한 후 작업을 처리하게 됩니다.
    ex. “이건 지금 처리할게 아닌데… 3초 뒤에 처리해줘!”
  • 이외에도 많은 작업 옵션들이 존재합니다. (https://docs.nestjs.com/techniques/queues)

Consumer (소비자)

  • 이제 작업을 등록했으니 작업을 처리할, 수신할 클래스를 생성하겠습니다.
AppConsumer
  • Processor 데코레이터를 통해서 수신할 큐 이름을 지정합니다.
    Process 데코레이터를 이용해서 수신할 작업 명을 지정합니다.
    수신 후, 해당 데이터를 Logger로 출력할 수 있게 코드 작성했습니다.
  • app.module.ts의 providers에 AppConsumer를 추가해줍니다.
  • postman으로 api를 요청하면 3초 뒤에 Logger가 찍히는 것을 볼 수 있습니다.
  • ecs 상에서 하나의 redis 서버를 두고 작업을 진행할 때도 문제없습니다.
  • Consumer(소비자)는 해당 메시지 큐 수신 작업을 나눠서 진행하게 됩니다.
app.service.ts
  • 메시지큐 추가 작업을 for문을 통해 여러개를 추가한 후 postman으로 요청을 보냅니다.
1번 인스턴스
2번 인스턴스
  • Consumer가 사이좋게 나눠 작업을 수신하는 것을 볼 수 있습니다!

--

--