Merhaba,

 

Bu yazıda NestJS ve Redis ile Queue kullanımından bahsedeceğim. 

 

Queue işleminde kısaca producer (üretici) ve consumer (tüketici) bulunuyor.  Örnek projemizde basitçe bir producer ve consumer oluşturacağız. Producer tarafından queue'ya bir job atıp, bunu consumer tarafında karşılayacağız. Job verilerini ise Redis üzerinde depolayacağız.

 

İlk olarak bir NestJS projesi oluşturuyoruz:

nest new nest-redis-queue-sample

 

Gerekli paketleri kuruyoruz:

npm i @nestjs/bull bull

 

Redis'i kolaylık olması adına Docker üzerinden çalıştırıyoruz:

docker run --name rediscache -p 6379:6379 -d redis

 

app.module.ts dosyasını açıp gerekli import ve register işlemini yapıyoruz. message-queue adında bir queue oluşturuyoruz.

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

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

 

message.producer.ts adında bir dosya oluşturuyoruz:

import { InjectQueue } from "@nestjs/bull";
import { Injectable } from "@nestjs/common";
import { Queue } from "bull";

@Injectable()
export class MessageProducer {
  constructor(@InjectQueue('message-queue') private queue: Queue) {}

  async sendMessage(message: string) {
    await this.queue.add('message-job', {
      text: message
    });
  }
}

Burada sendMessage adında bir fonksiyon oluşturduk. Bu fonksiyon gelen message parametresini message-job adıyla queue'ya atıyor.

 

app.controller.ts dosyasını açıyoruz ve şu şekilde bir kodlama yapıyoruz:

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

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

  @Get()
  getHello(): string {
    return this.appService.getHello();
  }

  @Get('send-message')
  async sendMessage(@Query('message') message: string) {
    this.messageProducer.sendMessage(message);
    return message;
  }
}

Burada send-message adında bir route oluşturduk. Bu route'da Query olarak gelen (?message=) message parametresini alıp producer'a aktarıyoruz ve geriye message'ı döndürüyoruz.

 

message.consumer.ts adında bir dosya oluşturuyoruz:

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

@Processor('message-queue')
export class MessageConsumer {
  @Process('message-job')
  messageJob(job: Job<unknown>) {
    console.log(job.data);
  } 
}

 

app.module.ts dosyasını tekrar açıp producer ve consumer'ı provider olarak ekliyoruz:

...
import { MessageProducer } from './message.producer';
import { MessageConsumer } from './message.consumer';

@Module({
  ...
  providers: [AppService, MessageProducer, MessageConsumer],
})
export class AppModule {}

 

Projeyi ayağa kaldırıyoruz:

npm run start

 

http://localhost:3000/send-message?message=yusuf linkine gidiyoruz ve yusuf şeklinde bir dönüş alıyoruz. Konsol ekranını kontrol ettiğimizde ise şu çıktıyı görüyoruz:

 

Bu elbette çok basit bir örnekti. Gerçek hayatta queue işlemini birçok farklı yerde kullanabiliriz. Örneğin mail gönderme, dosya silme vs. gibi.

 

Projenin kaynak kodlarına buradan ulaşabilirsiniz.

 

Umarım yararlı olmuştur.

 

İyi çalışmalar.