Envie e Consuma Tarefas com SQS

AWSBeginner
Pratique Agora

Introdução

Um serviço de pedidos precisa aceitar uma tarefa agora e processá-la depois. Você criará uma fila, receberá uma tarefa, executará um consumidor fornecido e confirmará o pedido armazenado antes de confirmar a mensagem.

Conclua primeiro Leia e Grave no DynamoDB a partir do Lambda e seus pré-requisitos guiados. Esta VM independente fornece um consumidor, sua função IAM com permissões restritas, uma tabela de pedidos vazia e dados de referência; nenhuma fila ou tarefa está preparada.

Relação com as certificações

Este laboratório oferece prática nos seguintes tópicos de exame.

Crie uma Fila de Tarefas Independente

Nesta etapa, crie uma fila vazia e inspecione o consumidor fornecido antes de enviar qualquer tarefa.

Use AWS View ao lado do Terminal para comparar as filas atuais, os resultados do consumidor e os pedidos armazenados. Preserve os dados de referência não relacionados.

O Amazon Simple Queue Service (SQS) armazena tarefas como mensagens para um consumidor. Um produtor envia tarefas e um consumidor as processa. Uma fila separa o momento dessas ações: o produtor não precisa esperar que o consumidor termine. Uma fila Standard pode entregar uma mensagem mais de uma vez; receber e confirmar são operações separadas.

Comece no diretório de trabalho preparado:

cd /home/labex/project

Inspecione o consumidor fornecido e a tabela de pedidos vazia. O consumidor calcula 250 centavos por item mais uma taxa de 100 centavos. Sua função de execução pode gravar apenas na tabela de pedidos; a tabela de referência contém dados não relacionados que devem ser preservados.

aws lambda get-function-configuration --function-name labex-q01-worker --query '{Name:FunctionName,Role:Role,Runtime:Runtime}'
aws dynamodb scan --table-name labex-q01-orders --query Items

Espere uma lista de itens vazia. Crie sua própria fila. --query QueueUrl --output text seleciona seu endereço como texto simples; $(...) armazena essa saída na variável de shell QUEUE_URL para comandos posteriores.

QUEUE_URL=$(aws sqs create-queue --queue-name labex-q01-jobs --attributes VisibilityTimeout=300 --query QueueUrl --output text)

O tempo limite de visibilidade dá ao consumidor 300 segundos antes que uma mensagem recebida possa ficar disponível novamente. É uma ocultação temporária, não uma exclusão. Exploraremos a expiração e a nova entrega no próximo laboratório.

Inspecione a identidade da fila e as contagens atuais:

aws sqs get-queue-attributes --queue-url "$QUEUE_URL" --attribute-names QueueArn VisibilityTimeout ApproximateNumberOfMessages ApproximateNumberOfMessagesNotVisible

Espere que VisibilityTimeout seja 300 e que ambas as contagens de mensagens sejam 0. As contagens são sinais operacionais aproximados, não uma garantia de conclusão do negócio. Em AWS View, sua fila aparece com zero tarefas disponíveis e zero em processamento; o Lambda fornecido não tem execuções e a tabela de pedidos continua vazia.

Exemplo oficial dos detalhes de uma fila no Console do Amazon SQS

O Console oficial mostra o mesmo nome, tipo, URL e ARN da fila que você inspeciona com a CLI. Esses são valores de exemplo; continue com sua própria QUEUE_URL. Use AWS View para observar os recursos deste laboratório.

Fonte: AWS SQS.

Envie e Receba uma Tarefa de Pedido

Nesta etapa, envie uma tarefa e receba-a para observar a diferença entre mensagens disponíveis e mensagens em processamento.

Entrega pela fila e resultado de negócio

Receba, processe e depois confirme: exclua a mensagem da fila somente após confirmar o pedido armazenado, usando o identificador de recebimento atual.

O corpo de uma mensagem contém dados da aplicação. O SQS mantém o JSON como texto; seu consumidor deve interpretá-lo. Envie uma pequena tarefa de pedido sintética:

aws sqs send-message --queue-url "$QUEUE_URL" --message-body '{"id":"queue-order","quantity":2}'

A resposta inclui MessageId e MD5OfMessageBody. O ID da mensagem a identifica; o MD5 resume os bytes do corpo. Isso confirma a aceitação pela fila, não um pedido concluído. AWS View agora mostra uma tarefa disponível, enquanto a tabela de pedidos permanece vazia.

Receba uma mensagem e salve a resposta. > redireciona a saída para received.json em vez de exibi-la. --wait-time-seconds 5 permite uma breve espera de consulta longa se nenhuma tarefa estiver disponível imediatamente.

aws sqs receive-message --queue-url "$QUEUE_URL" --max-number-of-messages 1 --wait-time-seconds 5 --message-system-attribute-names ApproximateReceiveCount --output json > received.json

Leia o corpo seguro da aplicação e a contagem de recebimentos com jq, que seleciona campos do JSON:

jq '.Messages[0] | {MessageId,Body,Attributes}' received.json

Espere um corpo contendo queue-order e a quantidade 2, com contagem de recebimentos 1 no primeiro recebimento. A resposta completa também contém um identificador de recebimento: um valor para esta tentativa específica de entrega. Você usará o identificador mais recente ao confirmar esta mensagem.

aws sqs get-queue-attributes --queue-url "$QUEUE_URL" --attribute-names ApproximateNumberOfMessages ApproximateNumberOfMessagesNotVisible

Espere 0 disponíveis e 1 não visível. Em AWS View, a tarefa está em processamento, mas ainda não há pedido. Recebê-la não a processou nem a excluiu. Continue para a próxima etapa em até 300 segundos. Se você passar mais tempo lendo, receba-a novamente no mesmo arquivo para obter seu identificador de recebimento mais recente antes de processá-la e excluí-la.

Exemplo de AWS View: uma tarefa em processamento, ainda sem execução do consumidor ou pedido armazenado

Este exemplo real mostra a entrega antes do processamento. Os IDs das mensagens serão diferentes em seu ambiente de trabalho.

Processe a Tarefa Antes de Confirmá-la

Nesta etapa, processe o corpo recebido, verifique o pedido persistido e depois confirme a mensagem.

Use o corpo que você realmente recebeu como entrada do consumidor. fromjson converte a string JSON dentro da resposta do SQS em um objeto JSON; o redirecionamento grava esse objeto em job.json.

jq '.Messages[0].Body | fromjson' received.json > job.json

O Lambda fornecido aceita esse objeto de pedido. Como no curso de Lambda, fileb://job.json envia os bytes do arquivo e o último nome de arquivo recebe a resposta da função. Invoque o consumidor:

aws lambda invoke --function-name labex-q01-worker --payload fileb://job.json worker-response.json

Um status bem-sucedido da API Invoke, por si só, não comprova um processamento bem-sucedido. Inspecione o corpo da resposta:

cat worker-response.json

Espere processed: true, quantidade 2 e total_cents: 600. Depois, leia o item armazenado, em vez de confiar apenas na mensagem retornada pela função:

aws dynamodb get-item --table-name labex-q01-orders --key '{"id":{"S":"queue-order"}}' --consistent-read --query Item

Espere queue-order, quantidade 2 e total 600. AWS View mostra a entrada e o resultado reais do consumidor e o mesmo pedido persistido. A tarefa permanece em processamento até você confirmá-la. Se a resposta do consumidor ou o item armazenado estiver incorreto, mantenha a mensagem para diagnóstico em vez de excluí-la.

Após confirmar o pedido, selecione o identificador de recebimento atual como texto simples e exclua essa entrega da fila:

RECEIPT_HANDLE=$(jq -r '.Messages[0].ReceiptHandle' received.json)
aws sqs delete-message --queue-url "$QUEUE_URL" --receipt-handle "$RECEIPT_HANDLE"

Uma exclusão bem-sucedida normalmente não imprime nada. Leia as contagens novamente:

aws sqs get-queue-attributes --queue-url "$QUEUE_URL" --attribute-names ApproximateNumberOfMessages ApproximateNumberOfMessagesNotVisible

Ambas as contagens devem ser 0. AWS View mostra uma fila vazia e um pedido armazenado. Você separou a aceitação pela fila, a entrega temporária, o processamento de negócio e a confirmação. Uma fila Standard ainda pode entregar mensagens novamente em aplicações reais; essa sequência não é uma garantia de exatamente uma vez de ponta a ponta. Unidades posteriores ensinam uma proteção durável contra duplicatas.

Limpe Apenas Sua Fila e Seus Resultados

Nesta etapa, remova sua fila, seu resultado e seus logs, preservando os recursos fornecidos.

Remova a fila e o pedido que você criou, preservando o consumidor fornecido, as estruturas das tabelas e os dados de referência. A exclusão da fila descarta qualquer tarefa restante, portanto confirme primeiro que a etapa anterior foi concluída com sucesso.

aws sqs delete-queue --queue-url "$QUEUE_URL"
aws dynamodb delete-item --table-name labex-q01-orders --key '{"id":{"S":"queue-order"}}'

A execução do consumidor criou um grupo do CloudWatch Logs. Exclua os logs de execução deste laboratório como parte da limpeza:

aws logs delete-log-group --log-group-name /aws/lambda/labex-q01-worker

Verifique o estado dos recursos com consultas bem-sucedidas aos serviços:

aws sqs list-queues
aws dynamodb scan --table-name labex-q01-orders --query Items
aws dynamodb scan --table-name labex-q01-reference --query Items

Nenhuma URL de fila deve permanecer, a lista de itens de pedidos deve estar vazia e o item de referência ainda deve dizer keep unchanged. AWS View mostra que não há filas, pedidos ou logs de execução, com o consumidor fornecido e a referência ainda presentes. Um erro de autenticação ou de rede não comprova uma exclusão bem-sucedida.

Remova os arquivos comuns de resposta após verificar os recursos:

rm -f received.json job.json worker-response.json

Use a verificação da etapa antes de encerrar seu ambiente.

Resumo

Você criou uma fila Standard do SQS, enviou e recebeu uma tarefa de pedido em JSON, verificou o processamento real do Lambda e o item persistido no DynamoDB e confirmou a mensagem com seu identificador de recebimento. Você distinguiu aceitação, entrega em processamento e conclusão do negócio e, depois, removeu sua fila, seu pedido e seus logs de execução, preservando os recursos fornecidos.