1 puan yazan spotlight21c 2026-04-11 | Henüz yorum yok. | WhatsApp'ta paylaş

Merhaba.
nestjs + sqs kombinasyonuyla servis geliştirirken NestJS ekosistemindeki diğer SQS paketlerini kullanıyordum.
Ancak gerçek prodüksiyon ortamında yaşadığım bazı rahatsızlıklar vardı. Belirli bir pakete PR da gönderdim, fakat artık güncellenmiyor ya da bunun bir sorun olduğunun farkında olmayan yerler de var. Bu yüzden bunları doğrudan çözmek için bu modülü geliştirdim. Hatta daha önce kullandığım SQS modülünü bununla değiştirip stabil şekilde kullanıyorum.
NestJS'te SQS modülü arayanlara ve benimkine benzer dertleri olanlara faydalı olacağını düşündüğüm için paylaşıyorum.

Bu paketin şu özellikleri var:

NestJS dostu

NestJS'te modülleri dinamik olarak oluşturup import edebilir, dekoratör takılmış handler'ları enjekte ederek kolay bir şekilde uygulayabilirsiniz.
Diğer çoğu SQS paketindekine benzer bir signature'a sahiptir.

@Module({  
  imports: [  
    ConfigModule.forRoot(),  
    SqsModule.registerAsync({  
      inject: [ConfigService],  
      useFactory: (config: ConfigService) => {  
        const region = config.getOrThrow<string>('AWS_REGION');  
        const queueUrl = config.getOrThrow<string>('ORDERS_QUEUE_URL');  
        const defaultSqsClient = new SQSClient({ region });  
  
        return {  
          defaultSqsClient,  
          consumers: [{ name: 'orders', queueUrl }],  
          producers: [{ name: 'orders', queueUrl }],  
        };  
      },  
    }),  
  ],  
})  
export class AppModule {}  
  
@Injectable()  
export class OrderQueueHandler {  
  @SqsMessageHandler('orders')  
  public async onMessage(message: Message): Promise<Message> {  
    // return message to ack/delete  
    return message;  
  }  
  
  @SqsConsumerEventHandler('orders', 'processing_error')  
  public onProcessingError(error: Error, message: Message) {  
    // report error  
  }  
}  

En güncel bbc paketlerini kullanır

Bu paket, haftada 1,3 milyondan fazla indirilen ve Node.js ekosisteminde SQS kütüphanesi denince en çok bilinen aşağıdaki iki kütüphanenin en güncel sürümlerini temel alıyor.

https://github.com/bbc/sqs-producer
https://github.com/bbc/sqs-consumer

sqs-consumer içinde v14'ten itibaren anlamlı bir breaking change bulunuyor.
https://github.com/bbc/sqs-consumer/discussions/584

13 ve altındaki sürümlerde SQS handler'ı void döndürse bile bu, ack davranışı olarak kabul ediliyordu.
Ancak 14. sürümden itibaren yalnızca SQS handler'ının açıkça döndürdüğü message ack olarak kabul ediliyor.
Bu değişiklik daha açık, daha öngörülebilir ve kullanıcıya ack implementasyonu konusunda kafa karışıklığı yaşatmayan anlamlı bir değişiklik.
Buna rağmen piyasadaki NestJS SQS modülü olarak sunulan çoğu npm paketi hâlâ sqs-consumer 13 ve altı sürümleri kullanıyor.

Boot-time doğrulama

Uygulama başlatılırken hatalı yapılandırmaları anında yakalar; bu sayede daha güvenli kullanılabilir.

  • Yinelenen consumer/producer adlarını algılar
  • Var olmayan bir consumer için dekoratör kullanılırsa anında hata verir
  • Event adı yazım hatalarını algılar
  • batch/single handler parametre tip uyuşmazlıklarını algılar
  • batch/single dönüş değeri tip uyuşmazlıklarını algılar

Graceful shutdown

bbc/sqs-consumer, graceful shutdown için pollingCompleteWaitTimeMs seçeneğini sunar.
Ayrıca NestJS'in kendi lifecycle yapısı vardır.
NestJS'in onModuleDestroy aşamasında, iç tarafta her consumer stopped event'ini yayınlayana kadar kapanış beklenir.
Bu event ancak consumer'ın işlediği mesajlar tamamlandığında oluştuğu için, mesaj işleme bitirilir ve süreç güvenli şekilde kapanır.
NestJS yaşam döngüsüne otomatik bağlandığı için
app.enableShutdownHooks() açık olduğu sürece,
pollingCompleteWaitTimeMs ve shutdownTimeoutMs değerlerini doğru ayarlayarak k8s ortamında ani kapanmalarda da daha güvenli şekilde kullanabilirsiniz.

Prodüksiyonda SQS kullanırken "bu ne zaman güncellenecek" diye düşündüğüm şeyler uzun süredir güncellenmediği için,
sağlam bir geliştirme kültürü oluştururken yaşadığım zorlukları çözmek adına ortaya çıkmış bir sonuç bu.
Benzer bir ortamda benzer dertler yaşıyorsanız bir kez deneyip geri bildirim verirseniz sevinirim.

Henüz yorum yok.

Henüz yorum yok.