開発覚書はてな版

個人的な開発関連の備忘録

【NestJS】NestJSでBullを使ってみた

概要

今回はNestJS上でBullを使ってみたサンプルです。

docs.nestjs.com

BullとはRedisベースのメッセージキューです。 github.com

実行環境

  • Node.js - 10.x
  • redis - 5.x

使用ライブラリ

  • @nestjs/core - 6.7.x
  • @nestjs/bull - 0.0.1
  • bull - 3.12.1
  • @types/bull - 3.12.x

サンプルソース

app.processor.ts

  • Processorデコレータに test を定義します。
  • 処理は5秒待機してコンソールログを出力するものです。
import { Process, Processor } from '@nestjs/bull';
import { Logger } from '@nestjs/common';
import { Job } from 'bull';

@Processor('test')
export class AppProcessor {
  @Process()
  async exec(job: Job<unknown>) {
    await new Promise((resolve) => setTimeout(resolve, 5000));
    Logger.debug(`id=${job.id}, timestamp=${job.timestamp}`);
  }
}

app.service.ts

  • InjectQueue に test を指定します。
  • Queue.add でキューにデータを登録します。
  • 登録したジョブIDを戻します。
import { InjectQueue } from '@nestjs/bull';
import { Injectable } from '@nestjs/common';
import { Queue } from 'bull';

@Injectable()
export class AppService {
  constructor(@InjectQueue('test') private readonly testQueue: Queue) {}

  async addQueue() {
    const job = await this.testQueue.add({}, { lifo: true });
    return job.id;
  }
}

app.controller.ts

import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get('bull_test')
  bullTest() {
    return this.appService.addQueue();
  }
}

app.module.ts

  • BullModuleを定義します。定義時に test を定義します。
import { BullModule } from '@nestjs/bull';
import { Module } from '@nestjs/common';

import { AppController } from './app.controller';
import { AppProcessor } from './app.processor';
import { AppService } from './app.service';

@Module({
  imports: [
    BullModule.registerQueue({
      name: 'test',
      redis: {
        host: 'localhost',
        port: 6379,
      },
    }),
  ],
  controllers: [AppController],
  providers: [AppService, AppProcessor],
})
export class AppModule {}

実行結果

  • http://localhost:3000/bull_test にブラウザからアクセスすることで、キューに処理が貯まっていきます。
  • 下記のキャプチャの通りに5秒後にログが出力されるようになります。 f:id:kakkoya:20200412201513p:plain

サンプルソース一式

github.com

おわりに

  • バッチ処理を起動するAPIとして使用が可能です。
  • NestJS内で完結して開発が出来るので便利です。