Pular para conteúdo

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:

  1. Requisição: O Producer envia uma mensagem para uma fila SQS de requisições (Request Queue).
  2. Atributo de Callback: Na mensagem, o Producer adiciona um atributo especial chamado queue_arn_callback. O valor deste atributo é o ARN da fila SQS onde o Producer espera receber a resposta (Reply Queue).
  3. Processamento: O Consumer recebe a mensagem da Request Queue, processa a requisição e gera uma resposta.
  4. Resposta: O Consumer extrai o queue_arn_callback dos 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

  1. Produtor A envia uma mensagem para a Request Queue, especificando o ARN da Reply Queue A como seu destino de callback.
  2. Produtor B envia outra mensagem para a mesma Request Queue, mas especifica o ARN da Reply Queue B como seu callback.
  3. O Consumidor recebe ambas as mensagens da Request Queue central.
  4. Para cada mensagem, o Consumidor lê o atributo queue_arn_callback e envia a resposta para a fila correta: a resposta da Mensagem 1 vai para a Reply Queue A e a da Mensagem 2 vai para a Reply Queue B.
  5. Cada produtor, então, consome a resposta de sua própria fila de resposta designada.
  6. 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 o callback_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_callback e o correlation_id.
  • Validação: Se o atributo queue_arn_callback nã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_callback for válido, ele é usado para determinar a fila de destino. O correlation_id é adicionado como um atributo na mensagem de resposta para permitir o rastreamento.

Vantagens da Nova Abordagem

  1. Simplicidade: Remove a necessidade de gerenciar um tópico SNS para cada tipo de resposta, simplificando a infraestrutura.
  2. Flexibilidade: O produtor tem controle total sobre onde deseja receber a resposta, podendo usar filas diferentes para callbacks diferentes, se necessário.
  3. Desacoplamento: Mantém o desacoplamento entre produtor e consumidor, pois eles só precisam conhecer a fila de requisição, não um ao outro.
  4. 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.