Arquitetura de Mensageria: Padrão Request-Reply com SQS
Este documento descreve a arquitetura de mensageria baseada no padrão Request-Reply, utilizando exclusivamente o Amazon SQS. Este modelo substitui a abordagem anterior que usava uma combinação de SQS e SNS para o retorno de respostas.
Visão Geral
O objetivo desta arquitetura é permitir que um serviço produtor (Producer) envie uma requisição para um serviço consumidor (Consumer) e receba uma resposta de forma assíncrona, sem a necessidade de um tópico intermediário.
O fluxo funciona da seguinte maneira:
- Requisição: O
Producerenvia uma mensagem para uma fila SQS de requisições (Request Queue). - Atributo de Callback: Na mensagem, o
Produceradiciona um atributo especial chamadoqueue_arn_callback. O valor deste atributo é o ARN da fila SQS onde oProducerespera receber a resposta (Reply Queue). - Processamento: O
Consumerrecebe a mensagem daRequest Queue, processa a requisição e gera uma resposta. - Resposta: O
Consumerextrai oqueue_arn_callbackdos atributos da mensagem original. Ele então publica a mensagem de resposta diretamente na fila SQS especificada por esse ARN.
Diagrama do Fluxo com Múltiplos Produtores
Este diagrama ilustra como múltiplos produtores podem interagir com um único consumidor, com cada um recebendo a resposta em sua própria fila de callback designada.
graph TD
subgraph Produtores
direction LR
P1[Producer A]
P2[Producer B]
end
subgraph "Serviço Consumidor (AT Learning Gap Engine)"
C[Consumer]
DLQ[Dead Letter Queue]
end
subgraph "AWS SQS"
direction LR
RQ[Request Queue]
RPQ_A[Reply Queue A]
RPQ_B[Reply Queue B]
end
P1 -- "1. Envia Msg 1<br/>callback_arn: Reply Queue A" --> RQ
P2 -- "2. Envia Msg 2<br/>callback_arn: Reply Queue B" --> RQ
RQ -- "3. Consumidor recebe ambas as mensagens" --> C
C -- "4a. Processa Msg 1 e responde para<br/><b>Reply Queue A</b>" --> RPQ_A
C -- "4b. Processa Msg 2 e responde para<br/><b>Reply Queue B</b>" --> RPQ_B
RPQ_A -- "5a. Producer A recebe sua resposta" --> P1
RPQ_B -- "5b. Producer B recebe sua resposta" --> P2
C -- "Se a msg não tiver callback_arn,<br/>ela vai para a DLQ após retentativas" --> DLQ
Explicação do Diagrama
- Produtor A envia uma mensagem para a
Request Queue, especificando o ARN daReply Queue Acomo seu destino de callback. - Produtor B envia outra mensagem para a mesma
Request Queue, mas especifica o ARN daReply Queue Bcomo seu callback. - O Consumidor recebe ambas as mensagens da
Request Queuecentral. - Para cada mensagem, o Consumidor lê o atributo
queue_arn_callbacke envia a resposta para a fila correta: a resposta da Mensagem 1 vai para aReply Queue Ae a da Mensagem 2 vai para aReply Queue B. - Cada produtor, então, consome a resposta de sua própria fila de resposta designada.
- Se uma mensagem chegar sem o atributo
queue_arn_callback, o consumidor falhará em processá-la, e a mensagem será eventualmente movida para a Dead Letter Queue (DLQ).
Implementação Técnica
SQSMessagePublisher
publish_to_queue_arn(queue_arn, message, headers): Um novo método foi adicionado para permitir a publicação de uma mensagem diretamente para uma fila SQS usando seu ARN. Ele extrai as informações necessárias do ARN para construir a URL da fila e enviar a mensagem.
BaseSQSConsumer
publish_response(response, callback_queue_arn, attributes): O método de publicação de resposta foi modificado. Agora, ele prioriza ocallback_queue_arn. Se este parâmetro for fornecido, a resposta é enviada diretamente para a fila de callback. A lógica de fallback para tópicos SNS foi removida.
Consumidores Específicos (ex: PedagogicalItemHierarchySQSConsumer)
- Extração de Atributos: O consumidor inspeciona os atributos da mensagem para extrair o
queue_arn_callbacke ocorrelation_id. - Validação: Se o atributo
queue_arn_callbacknão for encontrado, o consumidor lança uma exceção. Isso impede que a mensagem seja deletada da fila de requisição, fazendo com que ela seja reprocessada e, eventualmente, enviada para a Dead Letter Queue (DLQ). - Publicação da Resposta: Se o
queue_arn_callbackfor válido, ele é usado para determinar a fila de destino. Ocorrelation_idé adicionado como um atributo na mensagem de resposta para permitir o rastreamento.
Vantagens da Nova Abordagem
- Simplicidade: Remove a necessidade de gerenciar um tópico SNS para cada tipo de resposta, simplificando a infraestrutura.
- Flexibilidade: O produtor tem controle total sobre onde deseja receber a resposta, podendo usar filas diferentes para callbacks diferentes, se necessário.
- Desacoplamento: Mantém o desacoplamento entre produtor e consumidor, pois eles só precisam conhecer a fila de requisição, não um ao outro.
- Eficiência: A comunicação direta entre filas SQS pode ser mais eficiente e ter menor latência do que o fan-out via SNS quando há apenas um destinatário para a resposta.