O blog da AWS

Arquivamento e reprodução de mensagens com o Amazon SNS FIFO

Por Mohammed Atiq, arquiteto de soluções e Mithun Mallick, arquiteto de soluções principal da Serverless

 

O Amazon Simple Notification Service (SNS) oferece um serviço de mensagens flexível e totalmente gerenciado, permitindo que os aplicativos enviem e recebam mensagens. O SNS atua como um canal, entregando eventos de editores a assinantes.

Hoje, a AWS está anunciando um novo recurso que permite arquivar e reproduzir mensagens publicadas nos tópicos do SNS FIFO (primeiro a entrar, primeiro a sair). Agora, quando habilitado com uma política de arquivamento, os tópicos do SNS FIFO são automaticamente:

  • Arquiva eventos, com um arquivamento de mensagens no local, sem código, que não requer recursos externos. Você só precisa definir uma política de arquivamento sobre seu tópico, incluindo o período de retenção exigido (de 1 a 365 dias).
  • Eventos de repetição: os assinantes se beneficiam de uma funcionalidade de reprodução de mensagens gerenciada e sem código, com relatórios de progresso integrados e recursos de filtragem de mensagens. Para iniciar uma repetição, os assinantes simplesmente aplicam uma política de repetição à assinatura, definindo um ponto inicial e um ponto final usando registros de data e hora.

Esse recurso pode ser útil em cenários de recuperação de falhas e replicação de estado.

Recuperação de falhas

Em cenários de recuperação de falhas, os desenvolvedores podem usar isso para reprocessar um subconjunto de mensagens e se recuperar de uma falha de aplicativo posterior ou de um problema de dependência.

Considere uma situação em que um aplicativo de pesquisa precise reprocessar mensagens porque o índice do mecanismo de pesquisa foi apagado. Para iniciar a recuperação, o aplicativo de pesquisa atualizaria o atributo replayPolicy em sua assinatura existente usando a ação da API setSubscriptionAttributes, para começar a receber mensagens de um momento específico, em vez de quando a política de arquivamento foi aplicada ao tópico.

Replicação de estado

Para cenários de replicação de estado, esse recurso permite que novos aplicativos dupliquem o estado dos aplicativos anteriormente inscritos.

Considere um aplicativo de data warehouse interno que deve replicar o estado de um aplicativo de pesquisa externo para disponibilizar os dados indexados no mecanismo de pesquisa para gerentes de produto e outros funcionários internos. O aplicativo de data warehouse inscreve seu endpoint recém-criado (por exemplo, uma fila FIFO do Amazon SQS) no tópico usando a ação Subscribe API e define o atributo de assinatura ReplayPolicy.

Se optar por replicar o estado completo do mecanismo de pesquisa, poderá definir o registro de data e hora em sua ReplayPolicy para coincidir com a data e a hora de criação da assinatura do mecanismo de pesquisa, garantindo que todos os dados já entregues ao mecanismo de pesquisa também sejam entregues à ferramenta de armazenamento de dados.

Ativando a política de arquivamento por meio do console do SNS

Ao criar um novo tópico FIFO do SNS, você vê uma opção para a política de arquivamento. Essa política determina por quanto tempo o SNS armazena suas mensagens, disponibilizando-as para possível reenvio para uma assinatura, se necessário. A política de arquivamento não é ativada por padrão — você deve habilitá-la para cada tópico manualmente ou automatizar a operação.

Por exemplo, o período de retenção desse tópico do FIFO é definido em 30 dias. No entanto, você pode ajustar essa duração de 1 a 365 dias. Depois de ativar a política de arquivamento, as mensagens enviadas para esse tópico são arquivadas pelo período definido.

Para confirmar se a política de arquivamento está em vigor após a criação do tópico, verifique os detalhes do tópico. Ao lado da política de retenção, seu status é exibido como Ativo.

Ao inscrever uma fila SQS FIFO em um tópico SNS FIFO, você pode reproduzir mensagens, e o status de repetição mostra Não em execução. Você pode inscrever filas FIFO e SQS padrão em seus tópicos de SNS FIFO, oferecendo flexibilidade para vários requisitos de casos de uso. Para iniciar uma repetição, navegue até o console do SNS, escolha Repetir e, em seguida, escolha Iniciar repetição.

Quando você inicia uma repetição, uma janela é exibida, permitindo que você especifique as datas de início e término, bem como a hora exata a partir da qual as mensagens são arquivadas. Esse recurso oferece a flexibilidade de reproduzir somente mensagens de interesse, em vez de todas as mensagens arquivadas, permitindo que você defina uma programação específica. Quando você escolhe Iniciar repetição, o serviço começa a enviar mensagens para o assinante.

Você também pode definir configurações para os recursos de arquivamento e reprodução FIFO do SNS com o AWS CloudFormation e o AWS Serverless Application Model (AWS SAM).

Casos de uso

Reproduzindo eventos para recuperação de erros em microsserviços

Em um cenário em que um aplicativo de seguro usa vários microsserviços, considere que um microsserviço de processamento de sinistros encontra um erro e retira uma reclamação. Esse descuido pode fazer com que a carga de trabalho fique fora de sincronia.

Com o recurso de arquivamento e repetição, você pode revisitar e reproduzir eventos a partir do momento em que o erro foi detectado. Isso permite que o microsserviço reconheça o evento perdido e conclua as ações necessárias, garantindo que o sistema permaneça atualizado e preciso.

  1. As mensagens são publicadas em um tópico FIFO do SNS a partir de um aplicativo.
  2. As mensagens são entregues em uma fila SQS FIFO contendo detalhes da solicitação a serem processados por um microsserviço downstream.
  3. O microsserviço falha ao processar uma série de mensagens devido a uma exceção e descarta todas as mensagens.
  4. Em seguida, o usuário inicia uma repetição do tópico SNS FIFO e especifica o período de tempo das mensagens a serem reproduzidas com base em quando a falha ocorreu.
  5. Agora, o microsserviço é capaz de processar com êxito as mensagens repetidas e os dados persistentes em uma tabela do DynamoDB.

Replicando o estado em todas as regiões

Em situações em que um aplicativo abrange várias regiões e um microsserviço encontra dificuldades em sua região principal, você pode replicar a infraestrutura para outra região usando uma configuração ativa/em espera.

Você pode redirecionar o tráfego para o microsserviço em espera na região secundária, mantendo a sincronização por meio de repetições de eventos. Você pode definir um horário de término na política de repetição do SNS, mas se isso não for definido, a repetição continuará até que todas as mensagens mais recentes sejam enviadas.

Depois, a assinatura do SNS retoma o funcionamento normal, capturando todas as novas mensagens. Essa abordagem é adequada para vários cenários de replicação de estados, como estratégias de backup entre regiões, pois ajuda a minimizar o tempo de inatividade e evitar a perda de mensagens.

  1. As mensagens são publicadas em um tópico FIFO do SNS a partir de um aplicativo.
  2. As mensagens são entregues em uma fila SQS FIFO contendo detalhes da solicitação a serem processados por um microsserviço downstream.
  3. O microsserviço falhou ao processar uma série de mensagens devido a uma exceção e descartou todas as mensagens.
  4. Em seguida, o usuário inscreve uma nova fila SQS FIFO em outra região, inicia uma repetição do tópico SNS FIFO e especifica o período de tempo das mensagens a serem reproduzidas com base em quando a falha ocorreu.
  5. O microsserviço em uma região diferente é capaz de recuperar as mensagens repetidas da nova fila FIFO do SQS, processar com êxito a série de mensagens e persistir os dados em uma tabela do DynamoDB.

Configurando o arquivo e a reprodução do SNS FIFO para processamento de seguros de automóveis

O gerenciamento de sinistros de seguro automóvel requer coordenação oportuna. Este passo a passo mostra os benefícios combinados do SNS FIFO e do SQS FIFO para processar solicitações na sequência correta.

As filas SQS FIFO e SQS standard podem ser inscritas no tópico SNS FIFO, oferecendo versatilidade no tratamento de solicitações. A funcionalidade de arquivamento e reprodução do SNS FIFO é fundamental; interrupções nos microsserviços downstream não comprometem a integridade das reivindicações devido à capacidade de reprodução.

Este passo a passo orienta você na implantação de um exemplo de processamento de sinistros de seguro automóvel usando o AWS CLI. Você cria um tópico SNS FIFO para envios de solicitações e duas filas SQS FIFO. A primeira fila é para o processamento primário das declarações, enquanto a segunda é especificamente para repetições de mensagens para oferecer suporte à replicação do estado do aplicativo em várias instâncias do sistema.

Pré-requisitos

Etapa 1 — Criação de recursos usando o AWS CLI e armazenando variáveis

Execute os seguintes comandos no terminal.

# Defina a região da AWS 
 REGION=$ (aws configure get region) 
 
 # Crie um tópico FIFO do SNS para reclamações de seguro automóvel 
 AUTO_INSURANCE_TOPIC_ARN=$ (aws sns create-topic --name “AutoInsuranceClaimStopic.fifo” --attributes “FIFOTOPIC=true, ContentBasedDeduplication=true, displayName=Tópico de reivindicações de seguro automóvel” --region | $REGION jq -r '.topicArn') # Crie filas primárias e reproduza filas FIFO do SQS AUTO_INSURANCE_QUEUE_URL=$ (aws sqs create-queue --queue-name “AutoInsuranceClaimsQueue.fifo” --attributes “FIFOQueue=true” --region $REGION | 
 
 
 jq -r '.queueURL') 
 AUTO_INSURANCE_REPLAY_QUEUE_URL=$ (aws sqs create-queue --queue-name “AutoInsurancePlayQueue.fifo” --attributes “FIFOQueue=true” --region $REGION | jq -r '.queueURL') # Obtenha ARNs para ambas as filas SQS AUTO_INSURANCE_True” --region $REGION | jq -r '.queueURL') # Obtenha ARNs para ambas as filas SQS AUTO_INSURANCE__R 'QUEUE_ARN=$ (aws sqs get-queue-attributes --queue-url $AUTO_INSURANCE_QUEUE_URL --attribute-names QueueRan --region $REGION | jq -r' .attributes.queuearn ') AUTO_INSURANCE_REPLAY_QUEUE_ARN=$ (aws sqs get-queue-attributes --queue-url $AUTO_INSURANCE_REPLAY=$ (aws sqs get-queue-attributes --queue-url $AUTO_INSURANCE_REPLAY=$ _QUEUE_URL --nomes de atributos QueuEarn --region $REGION | jq -r' 
 
 
 
 .attributes.queuEarn') 
 
 # Defina uma política que permita que o tópico seja publicado nas duas filas 
 SQS_POLICY_TEMPLATE= "{\" Policy\”:\ "{\\\" Version\\\”:\\\ "2012-10-17\\\”,\\\ "Statement\\\”: [{\\ "Sid\\\”:\\ "1\\\”,\\\ "Efeito\\\”:\\\ "Permitir\\\”,\\\ "Principal\\\”: {\\\ "Serviço\\\”:\\\ "sns.amazonaws.com\\\”},\\\ "Ação\\\”: [\\\ "SQS:SendMessage\\\"],\\\ "Recurso\\\””: [\\\ "$AUTO_INSURANCE_QUEUE_ARN\\\”,\\\ "$AUTO_INSURANCE_REPLAY_QUEUE_ARN\\\"],\\\ "Condição\\\”: {\\\ "ARNLike\\\”: {\\\ "AWS:sourceArn\\\”: [\\\ "ARN DO TÓPICO\\\"]}}}]}\ "} “

# Aplique a política de acesso às filas 
 aws sqs set-queue-attributes --queue-url $AUTO_INSURANCE_QUEUE_URL --attributes file: //< (echo $SQS_POLICY_TEMPLATE) aws sqs set-queue-attributes --queue-url $AUTO_INSURANCE_REPLAY_QUEUE_URL --attributes file: //< (echo $SQS_POLICY_URL TEMPLATE) # Inscreva a fila primária do tópico SNS FIFO criado 
 aws sns subscribe --topic-arn $AUTO_INSURANCE_TOPIC_ARN --protocol sqs --notification-endpoint $AUTO_INSURANCE_QUEUE_ARN --region $REGION 

Passo 2 — Definindo a política de arquivamento no tópico SNS FIFO

Modifique os atributos do tópico FIFO do SNS para definir um período de retenção. Isso determina por quanto tempo uma mensagem é retida no arquivo de tópicos. Este exemplo usa 30 dias

# Defina um período de retenção de 30 dias para o tópico SNS FIFO 
 
 aws sns set-topic-attributes --region $REGION --topic-arn $AUTO_INSURANCE_TOPIC_ARN --attribute-name ArchivePolicy --attribute-value “{\" MessageRetentionPeriod\”:\ "30\"}”

Etapa 3- Publicar detalhes do pedido de seguro automóvel

Publique um exemplo de declaração no tópico FIFO do SNS. Essa etapa imita um cenário real em que uma reclamação de seguro deve ser processada pelos assinantes do tópico.

# Obtenha a data e hora atual e publique uma amostra de reclamação de seguro 
 TIMESTAMP_START=$ (date -u +%FT%T.000Z) 
 aws sns publish --region $REGION --topic-arn $AUTO_INSURANCE_TOPIC_ARN --message “{\" claim_type\”:\ "collision\”,\ "registration\”:\ "AB123CDE\”}” ID do grupo de mensagens “grupo1"

Etapa 4 — Lendo os detalhes do pedido de seguro automóvel

Recupere os detalhes da reclamação de seguro da fila primária do SQS FIFO. Isso simula um processo de leitura da reclamação do seguro para agir. Depois de ler a mensagem, a solicitação é excluída da fila para evitar o reprocessamento.

# Obtenha os detalhes da solicitação na fila primária e, em seguida, exclua para evitar redundância 
 MESSAGE=$ (aws sqs receive-message --region $REGION --queue-url $AUTO_INSURANCE_QUEUE_URL --output json) MESSAGE_TEXT=$ (echo “$MESSAGE” | jq -r '.Messages [0] .Body') MESSAGE_RECEIPT=$ (echo “$MESSAGE” | jq -r '.Messages [0] .Body') MESSAGE_RECEIPT=$ (echo “$MESSAGE” | jq -r '.Messages [0] .Body') 
 MESSAGE_RECEIPT=$ (echo “$MESSAGE” MESSAGE” | jq -r '.Messages [0] .receiptHandle') aws sqs delete-message --region $REGION --queue-url $AUTO_INSURANCE_QUEUE_URL --receipt-handle $MESSAGE_RECEIPT echo “Detalhes da reclamação recebida: $ {MESSAGE_TEXT}”  

Passo 5 — Inscrevendo a fila SQS de repetição no tópico SNS FIFO

Para garantir que nenhuma reclamação seja perdida, configure uma política de repetição para sua assinatura da fila SQS FIFO. Essa política define a programação a partir da qual as mensagens são reproduzidas na fila FIFO do SQS. Aqui, você assina uma fila de repetição com uma política de repetição e depois monitora o status da fila de repetição. Depois de concluído, leia os detalhes da solicitação repetida na fila secundária do SQS FIFO. Se algum problema de processamento ocorreu inicialmente, há uma segunda chance de processar a reclamação.

Inscreva a fila de repetição no tópico SNS FIFO:

# Inscreva a fila de repetição no tópico e defina sua política de repetição 
 NEW_SUBSCRIPTION_ARN=$ (aws sns subscribe --region $REGION --topic-arn $AUTO_INSURANCE_TOPIC_ARN --protocol sqs --return-subscription-arn --notification-endpoint $AUTO_INSURANCE_REPLAY_QUEUE_ARN --attributes “{\" ReplayPolicy\”:\ "{\\\" PointType\\\”:\\\ "Timestamp\\\”,\\\ "StartingPoint\\\”:\\\ "$TIMESTAMP_START\\\"}}” --output json | jq -r '.subscriptionArn')

Para monitorar o status da repetição:

# Aguarde a conclusão do replay 
 enquanto [[$ (aws sns get-subscription-attributes --region $REGION --subscription-arn $NEW_SUBSCRIPTION_ARN --output text | awk 'END {print $9} ')! = 'Concluído']]; faça printf” . “; sleep 5; pronto; echo “Replay complete”;

Para ler a mensagem repetida e excluí-la da fila:

# Busque a mensagem repetida e remova-a da fila 
 REPLAYED_MESSAGE=$ (aws sqs receive-message --region $REGION --queue-url $AUTO_INSURANCE_REPLAY_QUEUE_URL --output json) 
 REPLAYED_MESSAGE_TEXT=$ (echo “$REPLAYED_MESSAGE” | jq -r '.Messages [0] .Body') REPLAYED_MESSAGE_RECEIPT=$ (echo “$REPLAYED_MESSAGE” | jq -r '.Messages [0] .receiptHandle') aws sqs delete-message --region $REGION --queue-url $AUTO_INSURANCE_REPLAY_QUEUE_URL --receipt-handle $REPLAYED_MESSAGE_RECEIPT echo “Detalhes da reclamação repetida recebida: $ {REREPLAY _MENSAGEM_ REPRODUZIDA 
 
 
 TEXTO}”

Limpando

Para evitar custos desnecessários, limpe os recursos criados nesta explicação passo a passo:

# Exclua a fila primária do SQS FIFO aws sqs delete-queue --queue-url $AUTO_INSURANCE_QUEUE_URL --region $REGION # Exclua a fila de repetição SQS FIFO 
 aws sqs delete-queue --queue-url $AUTO_INSURANCE_REPLAY_QUEUE_URL --region $REGION 
 
 # Desative o atributo 'archivePolicy' aws sns set-topic-topich -attributes --region $REGION --topic-arn $AUTO_INSURANCE_TOPIC_ARN --attribute-name ArchivePolicy --attribute-value “{}” # Exclua o tópico SNS FIFO 
 aws sns delete-topic --topic-arn $AUTO_INSURANCE_TOPIC_ARN --region $REGION 

Conclusão

O novo recurso de arquivamento e reprodução FIFO do SNS fornece uma base substancial para aplicativos orientados por eventos, enfatizando a recuperação de falhas e a replicação do estado do aplicativo. Esses recursos permitem que os desenvolvedores gerenciem e se recuperem de interrupções com eficiência e garantam a replicação do estado em diferentes instâncias ou ambientes de aplicativos.

Comece a usar esse novo recurso FIFO do SNS usando o AWS Management Console, o AWS CLI, o AWS Software Development Kit (SDK) ou o AWS CloudFormation. Para obter informações sobre custo, consulte os preços do SNS e os preços do SQS.

Para obter mais recursos de aprendizado sem servidor, visite Serverless Land.

 

Este artigo foi traduzido do Blog da AWS em Inglês.

 


Sobre o autor

Mohammed Atiq é arquiteto de soluções

 

 

 

 

Mithun Mallick é arquiteto de soluções principal da Serverless

 

 

 

 

Tradutor

Daniel Abib é Enterprise Solution Architect na AWS, com mais de 25 anos trabalhando com gerenciamento de projetos, arquiteturas de soluções escaláveis, desenvolvimento de sistemas e CI/CD, microsserviços, arquitetura Serverless & Containers e segurança. Ele trabalha apoiando clientes corporativos, ajudando-os em sua jornada para a nuvem.

https://www.linkedin.com/in/danielabib/