1 puntos por spotlight21c 2026-04-11 | Aún no hay comentarios. | Compartir por WhatsApp

Hola.
He estado desarrollando servicios con la combinación de nestjs + sqs, usando otros paquetes de SQS dentro del ecosistema de NestJS.
Tenía varias incomodidades que experimenté en producción real, y aunque envié PR a ciertos paquetes, algunos ya no se actualizan o hay lugares donde ni siquiera reconocen esto como un problema, así que hice un módulo para resolverlo directamente. De hecho, reemplacé el módulo de SQS que usaba antes por este y lo estoy usando de forma estable.
Lo comparto porque creo que puede ser útil para quienes estén buscando un módulo de SQS para NestJS, y para quienes hayan tenido inquietudes parecidas a las mías.

Este paquete tiene las siguientes características:

Amigable con NestJS

En NestJS, permite generar e importar módulos dinámicamente, e inyectar handlers con decoradores para una implementación sencilla.
Tiene una firma similar a la de la mayoría de los otros paquetes de SQS.

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

Usa los paquetes más recientes de BBC

Este paquete, que supera 1.3 millones de descargas semanales, está basado en las versiones más recientes de las dos librerías de SQS más conocidas en el ecosistema de Node.js:

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

En sqs-consumer hay un breaking change importante desde la v14.
https://github.com/bbc/sqs-consumer/discussions/584

Hasta la versión 13, aunque el handler de SQS devolviera void, eso se consideraba comportamiento de ack.
Pero desde la versión 14, se considera ack de forma explícita el message que devuelve el handler de SQS.
Este cambio es importante porque es más explícito y predecible, y evita confusiones para el usuario al implementar el ack.
Sin embargo, la mayoría de los paquetes de npm que hoy se presentan como módulos SQS para NestJS siguen usando versiones 13 o anteriores de sqs-consumer.

Validación en el arranque

Detecta de inmediato configuraciones incorrectas en el momento en que arranca la app, lo que permite usarlo con mayor seguridad.

  • Detecta nombres duplicados de consumer/producer
  • Si se usa un decorador sobre un consumer que no existe, lanza error de inmediato
  • Detecta errores de tipeo en nombres de eventos
  • Detecta incompatibilidades de tipo en parámetros de handlers batch/single
  • Detecta incompatibilidades de tipo en valores de retorno de batch/single

Graceful shutdown

bbc/sqs-consumer ofrece la opción pollingCompleteWaitTimeMs para graceful shutdown.
Y NestJS tiene su propio lifecycle.
En la etapa onModuleDestroy de NestJS, internamente espera a que cada consumer emita el evento stopped antes de finalizar.
Como ese evento solo ocurre cuando termina el mensaje que el consumer estaba procesando, el procesamiento se completa y el proceso se cierra de forma segura.
Como está conectado automáticamente al ciclo de vida de NestJS,
si activan app.enableShutdownHooks(),
y configuran correctamente pollingCompleteWaitTimeMs y shutdownTimeoutMs, también se puede usar de forma más segura frente a terminaciones repentinas en entornos de k8s.

Mientras usaba SQS en producción, seguían acumulándose cosas que me hacían pensar “¿cuándo van a actualizar esto?”, pero como no se actualizaban, terminé resolviéndolo para poder construir una cultura de desarrollo más sólida.
Si están en un entorno parecido y tienen inquietudes similares, les agradecería mucho que lo probaran y me compartieran feedback.

Aún no hay comentarios.

Aún no hay comentarios.