Agik Setiawan - October 01, 2022

Queue Nest JS Using Bull & Redis

Queue adalah konsep yang biasa digunakan untuk melakukan pekerjaan secara bergantian sesuai dengan waktu yang telah ditentukan. dengan menggunakan Queue akan membuat kerja server menjadi lebih ringan karen pekerjaan yang menumpuk di kerjakan secara bergantian sehingga tidak membebani Prosessor dari Server yang digunakan.


Contoh kasus yang bisa di lakukan Queue misalnya adalah :

  • Sistem Kirim Email Broadcast
  • Pemprosesan Video & Gambar
  • Sistem Notifikasi
  • Dan masih banyak lagi

Cara kerja Queue:



Pada Contoh ilustrasi di atas adalah contoh penggunaan Queue pada sistem Pengolah Video menjadi Stream Video (HLS) yang di mulai dari user mengupload Video kemudian sistem Queue Mengirim Trigger ke Producer kemudian dari Producer di teruskan ke Processor yang mengolah Video lalu mengupload Video ke Cloud dengan format yang sudah di olah.

 

Persiapan

 

Siapkan Redis


Pastikan kita sudah memiliki Redis atau sudah menginstall Redis di komputer atau di server

 

Install Nest JS menggunakan Nest CLI


Pastikan kita sudah menginstall Nest CLI atau klik Cara Install Nest JS


Masukan perintah menggunakan terminal

nest new nest-queue-app

 

Install Bull


Masuk ke folder “nest-queue-app” lalu Masukan perintah

yarn add @nestjs/bull bull
yarn add -D @types/bull

atau

 npm install --save @nestjs/bull bull
 npm install --save-dev @types/bull


Buka dan edit file app.module.ts

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { BullModule } from '@nestjs/bull';

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

Atur redis host, port sesuai dengan Redis yang sudah di persiapkan di awal

 

Buat Queue


Setelah bull sudah di install dan module sudah di import selanjutnya adalah membuat Queue di mana ada beberapa hal yang harus di pahami yaitu Producer dan Consumer.

  1. Producer adalah fungsi yang menampung Queue dimana fungsi ini nantinya yang akan di jalankan oleh Consumer
  2. Consumer adalah fungsi yang menerima pekerjaan dari Producer

Pada contoh sederhana kali ini saya akan membuat module TestQueue dimana nanti di dalamnya ada contoh sederhana penggunaan Queue

yarn nest g mo test-queue

edit file “test-queue.module.ts”

import { Module } from '@nestjs/common';
import { BullModule } from '@nestjs/bull';

@Module({
    imports: [
        BullModule.registerQueue(
            {
                name: 'test-queue',
            }
        )

    ]
})
export class TestQueueModule { }

Buat service test-queue

yarn nest g s test-queue
import { InjectQueue } from '@nestjs/bull';
import { Injectable } from '@nestjs/common';
import { Queue } from 'bull';

@Injectable()
export class TestQueueService {
    constructor(@InjectQueue('test-queue') private testQueue: Queue){}

    async createTestQueue(){
        console.log('Test Queue Started');
        this.testQueue.add('test',{},{delay:3000})
    }
    
}

pada fungsi “createTestQueue” di atas adalah untuk menambahkan Queue dimana di dalamnya adalah

 this.testQueue.add('test',{},{delay:3000})

Delay digunakan untuk membuat jeda waktu dengan satuan millisecond, artinya Consumer akan menjalankan tugasnya setelah jeda waktu terpenuhi.

 

Buat class Processor


Buat class Processor yang akan berfugsi sebagai consumer atau Processor yang akan menjualankan tugas berdasarkan Queue yang di tambahkan

yarn nest g cl test-queue/test-queue.processor

test-queue.processor

import { Process, Processor } from "@nestjs/bull";
import { Injectable } from "@nestjs/common";

@Injectable()
@Processor('test-queue')
export class TestQueueProcessor {

    @Process('test')
    async testProcessor(){
        console.log('Test Queue Listened');
    }

}

 

Tambahkan class TestQueueProcessor kedalam Provider module


test-queue.module.ts

import { Module } from '@nestjs/common';
import { BullModule } from '@nestjs/bull';
import { TestQueueService } from './test-queue.service';
import { TestQueueProcessor } from './test-queue.processor';

@Module({
    imports: [
        BullModule.registerQueue(
            {
                name: 'test-queue',
            }
        )

    ],
    providers: [TestQueueService,TestQueueProcessor]
})
export class TestQueueModule { }

Untuk menjalankan Queue lewat Rest API kita membutuhkan Controller

 

Buatlah Controller

yarn nest g co test-queue

test-queue.controller.ts

import { Controller, Post } from '@nestjs/common';
import { TestQueueService } from './test-queue.service';

@Controller('test-queue')
export class TestQueueController {

    constructor(private testQueueService:TestQueueService){}

    @Post('create-test-queue')
    async createTestQueue(){
        this.testQueueService.createTestQueue();
    }

}

 

Testing Queue

Jalankan dan Akses http://localhost:3000/test-queue/create-test-queue menggunakan Post


Untuk memudahkan membuat delay saya menggunakan package milliseconds supaya lebih mudah mengatur konversi jeda waktunya

yarn add millisedonds

kemudian edit file service


test-queue.service.ts

import { InjectQueue } from '@nestjs/bull';
import { Injectable } from '@nestjs/common';
import { Queue } from 'bull';
import {minutes,seconds} from 'milliseconds';

@Injectable()
export class TestQueueService {
    constructor(@InjectQueue('test-queue') private testQueue: Queue){}

    async createTestQueue(){
        console.log('Test Queue Started');
        this.testQueue.add('test',{},{delay:minutes(1)})
    }
    
}


Sampai saat ini kita sudah berhasil implementasi Queue menggunakan Bull dan Redis di dalam Nest JS

 

Repository


https://github.com/mister-coding/nestjs-queue-bull-redis

Share


Comments