1 điểm bởi spotlight21c 2026-04-11 | Chưa có bình luận nào. | Chia sẻ qua WhatsApp

Xin chào.

Trong quá trình phát triển dịch vụ với tổ hợp nestjs + sqs, tôi đã sử dụng các gói SQS khác trong hệ sinh thái NestJS.
Tôi gặp một số bất tiện trong production thực tế, và dù đã gửi PR cho một số gói cụ thể, có nơi thì không còn được cập nhật nữa, có nơi lại không xem đó là vấn đề, nên tôi đã tự tạo một module để giải quyết trực tiếp. Trên thực tế, tôi đã thay thế module SQS đang dùng trước đây bằng module này và đang vận hành ổn định.
Tôi chia sẻ lại vì nghĩ rằng nó sẽ hữu ích cho những ai đang tìm một module SQS cho NestJS, cũng như những người từng có cùng trăn trở như tôi.

Gói này có các đặc điểm sau

Thân thiện với NestJS

Trong NestJS, có thể tạo và import module động, đồng thời inject các handler gắn decorator để triển khai dễ dàng.
Nó có signature tương tự như trong phần lớn các gói SQS khác.

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

Sử dụng các gói BBC mới nhất

Gói này dựa trên phiên bản mới nhất của hai thư viện dưới đây, vốn có hơn 1,3 triệu lượt tải mỗi tuần và là những thư viện SQS nổi tiếng nhất trong hệ Node.js.

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

Trong sqs-consumer, từ v14 đã có một thay đổi breaking change đáng chú ý.
https://github.com/bbc/sqs-consumer/discussions/584

Ở các phiên bản 13 trở xuống, ngay cả khi SQS handler trả về void thì vẫn được xem là hành vi ack.
Tuy nhiên từ phiên bản 14 trở đi, message mà SQS handler trả về mới được xem một cách rõ ràng là ack.
Đây là một thay đổi có ý nghĩa vì nó tường minh hơn, dễ dự đoán hơn và không gây nhầm lẫn cho người dùng khi triển khai logic ack.
Tuy nhiên, phần lớn các gói npm tự nhận là module NestJS SQS hiện nay vẫn đang dùng sqs-consumer phiên bản 13 trở xuống.

Kiểm tra tại thời điểm khởi động

Phát hiện ngay lập tức các cấu hình sai tại thời điểm ứng dụng khởi động, giúp sử dụng an toàn hơn.

  • Phát hiện tên consumer/producer trùng lặp
  • Nếu dùng decorator cho consumer không tồn tại thì báo lỗi ngay
  • Phát hiện lỗi gõ sai tên event
  • Phát hiện sai kiểu tham số của handler batch/single
  • Phát hiện sai kiểu giá trị trả về của batch/single

Graceful shutdown

bbc/sqs-consumer cung cấp tùy chọn pollingCompleteWaitTimeMs để hỗ trợ graceful shutdown.
Và trong NestJS cũng có lifecycle riêng của framework.
Ở giai đoạn onModuleDestroy của NestJS, nội bộ sẽ chờ cho đến khi từng consumer phát hành event stopped rồi mới kết thúc.
Vì event này chỉ được phát hành sau khi message mà consumer đang xử lý hoàn tất, nên việc xử lý message sẽ được hoàn thành và tiến trình sẽ dừng một cách an toàn.
Do đã được tự động gắn với vòng đời của NestJS,
chỉ cần bật app.enableShutdownHooks(),
và cấu hình đúng pollingCompleteWaitTimeMs, shutdownTimeoutMs thì ngay cả trong môi trường k8s cũng có thể dùng an toàn hơn trước các tình huống dừng đột ngột.

Trong quá trình sử dụng SQS ở production, những điều khiến tôi nghĩ “bao giờ cái này mới được cập nhật đây” vẫn liên tục không được cập nhật,
nên đã gây trở ngại trong việc xây dựng một văn hóa phát triển vững chắc, và đây là kết quả tôi tạo ra để giải quyết vấn đề đó.
Nếu bạn đang ở môi trường tương tự và có những băn khoăn giống tôi, rất mong bạn thử dùng và cho tôi phản hồi.

Chưa có bình luận nào.

Chưa có bình luận nào.