, 8 min read
Queue adalah konsep yang banyak digunakan untuk melakukan pekerjaan secara bergantian sesuai dengan waktu yang telah ditentukan
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 :
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.
Pastikan kita sudah memiliki Redis atau sudah menginstall Redis di komputer atau di server
Pastikan kita sudah menginstall Nest CLI atau klik Cara Install Nest JS
Masukan perintah menggunakan terminal
nest new nest-queue-app
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
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.
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 {}
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 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")
}
}
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
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()
}
}
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
Tags