1 poin oleh spotlight21c 2026-04-11 | Belum ada komentar. | Bagikan ke WhatsApp

Halo.
Saat mengembangkan layanan dengan kombinasi nestjs + sqs, saya sempat menggunakan paket-paket SQS lain di ekosistem NestJS.
Namun ada beberapa ketidaknyamanan yang saya alami langsung di production. Saya juga sempat mengirim PR ke paket tertentu, tetapi ada yang sudah tidak lagi diperbarui, atau ada juga yang tidak menganggap ini sebagai masalah. Karena itu, saya membuat modul ini untuk menyelesaikannya sendiri. Saat ini saya benar-benar sudah mengganti modul SQS yang sebelumnya saya gunakan dengan ini dan memakainya secara stabil.
Saya membagikannya karena saya rasa ini bisa membantu orang-orang yang sedang mencari modul SQS di NestJS, dan juga mereka yang punya kekhawatiran serupa dengan saya.

Paket ini memiliki karakteristik berikut

Ramah terhadap NestJS

Di NestJS, modul dapat dibuat dan di-import secara dinamis, lalu handler yang dipasangi decorator dapat di-inject sehingga implementasinya menjadi mudah.
Signature-nya juga mirip dengan yang ada di sebagian besar paket SQS lainnya.

@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  
  }  
}  

Menggunakan paket BBC versi terbaru

Paket ini memiliki lebih dari 1,3 juta unduhan mingguan, dan dibangun di atas versi terbaru dari dua library berikut yang paling terkenal sebagai library SQS di ekosistem Node.js.

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

Di sqs-consumer, ada breaking change yang bermakna mulai v14.
https://github.com/bbc/sqs-consumer/discussions/584

Pada versi 13 ke bawah, handler SQS dianggap sebagai perilaku ack meskipun mengembalikan void.
Namun mulai versi 14, message yang dikembalikan secara eksplisit oleh handler SQS-lah yang dianggap sebagai ack.
Perubahan ini lebih eksplisit, lebih mudah diprediksi, dan merupakan perubahan penting agar pengguna tidak bingung saat mengimplementasikan ack.
Namun, sebagian besar paket npm yang mengklaim sebagai modul NestJS SQS yang beredar saat ini masih menggunakan sqs-consumer versi 13 atau lebih rendah.

Validasi saat boot time

Konfigurasi yang salah bisa langsung terdeteksi saat aplikasi dijalankan, sehingga lebih aman untuk digunakan.

  • Mendeteksi nama consumer/producer yang duplikat
  • Jika decorator digunakan pada consumer yang tidak ada, langsung memunculkan error
  • Mendeteksi salah ketik pada nama event
  • Mendeteksi ketidaksesuaian tipe parameter handler batch/single
  • Mendeteksi ketidaksesuaian tipe nilai return batch/single

Graceful shutdown

bbc/sqs-consumer menyediakan opsi pollingCompleteWaitTimeMs untuk graceful shutdown.
Dan di NestJS, ada lifecycle milik NestJS.
Pada tahap onModuleDestroy di NestJS, secara internal proses shutdown akan menunggu sampai setiap consumer menerbitkan event stopped.
Karena event ini baru muncul setelah message yang sedang diproses oleh consumer selesai, pemrosesan message dapat dituntaskan lalu proses berhenti dengan aman.
Karena ini terhubung otomatis dengan lifecycle NestJS,
aktifkan app.enableShutdownHooks(),
dan atur pollingCompleteWaitTimeMs serta shutdownTimeoutMs dengan benar, maka bahkan di lingkungan k8s pun ini bisa digunakan dengan lebih aman saat terjadi penghentian mendadak.

Saat menggunakan SQS di production, hal-hal yang membuat saya berpikir “ini kapan diperbarui ya?” ternyata terus tidak kunjung diperbarui,
dan itu menjadi hambatan dalam membangun budaya pengembangan yang kokoh. Modul ini adalah hasil dari upaya menyelesaikan masalah tersebut.
Jika Anda berada di lingkungan yang mirip dan punya kekhawatiran serupa, saya akan berterima kasih jika Anda mencobanya sekali lalu memberikan feedback.

Belum ada komentar.

Belum ada komentar.