1 pontos por spotlight21c 2026-04-11 | Ainda não há comentários. | Compartilhar no WhatsApp

Olá.

Enquanto desenvolvia serviços com a combinação nestjs + sqs, eu vinha usando outros pacotes de SQS do ecossistema NestJS.
Eu tinha alguns incômodos que encontrei em produção de verdade e, embora tenha até enviado PR para um pacote específico, alguns não recebem mais atualizações e outros nem chegam a reconhecer isso como problema. Então criei um módulo para resolver isso diretamente. Na prática, substituí o módulo de SQS que usava antes por este e estou usando de forma estável.
Estou compartilhando porque acho que pode ajudar quem está procurando um módulo de SQS para NestJS e também quem já teve preocupações parecidas com as minhas.

Este pacote tem as seguintes características:

Amigável ao NestJS

No NestJS, é possível gerar e importar módulos dinamicamente e injetar handlers com decorators, o que permite uma implementação simples.
Ele tem uma assinatura parecida com a da maioria dos outros pacotes 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  
  }  
}  

Uso dos pacotes mais recentes da BBC

Este pacote tem mais de 1,3 milhão de downloads semanais e é baseado nas versões mais recentes das duas bibliotecas abaixo, que são as mais conhecidas como bibliotecas de SQS no ecossistema Node.js.

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

No sqs-consumer, há uma breaking change relevante a partir da v14.
https://github.com/bbc/sqs-consumer/discussions/584

Até a versão 13, mesmo que o handler do SQS retornasse void, isso era tratado como comportamento de ack.
Mas a partir da versão 14, a mensagem retornada explicitamente pelo handler do SQS é considerada como ack.
Essa mudança é importante porque torna o comportamento mais explícito e previsível, além de evitar confusão para o usuário na implementação do ack.
Ainda assim, a maioria dos pacotes npm que se apresentam como módulos SQS para NestJS no mercado ainda usa versões 13 ou anteriores do sqs-consumer.

Validação no boot

Ele detecta configurações incorretas imediatamente na inicialização da aplicação, permitindo um uso mais seguro.

  • Detecta nomes duplicados de consumer/producer
  • Gera erro imediatamente se um decorator for usado em um consumer inexistente
  • Detecta erros de digitação no nome de eventos
  • Detecta incompatibilidade de tipo de parâmetro entre handlers batch/single
  • Detecta incompatibilidade de tipo no valor de retorno de batch/single

Graceful shutdown

O bbc/sqs-consumer oferece a opção pollingCompleteWaitTimeMs para graceful shutdown.
E no NestJS existe o lifecycle do próprio framework.
Na etapa onModuleDestroy do NestJS, internamente ele espera o encerramento até que cada consumer emita o evento stopped.
Como esse evento só é emitido depois que a mensagem em processamento termina, o processamento é concluído e o processo é encerrado com segurança.
Como isso já fica conectado automaticamente ao ciclo de vida do NestJS,
basta ativar app.enableShutdownHooks() e
configurar corretamente pollingCompleteWaitTimeMs e shutdownTimeoutMs, que mesmo em ambiente k8s é possível usar com mais segurança diante de encerramentos repentinos.

Enquanto usava SQS em produção, várias coisas me faziam pensar “quando isso vai ser atualizado?”, mas essas atualizações continuavam não acontecendo.
Isso dificultava construir uma cultura de desenvolvimento mais robusta, então este é o resultado da tentativa de resolver esse problema.
Se você estiver em um ambiente parecido e passando por preocupações semelhantes, agradeço se puder experimentar e me dar feedback.

Ainda não há comentários.

Ainda não há comentários.