Отправка и потребление заданий с SQS

AWSBeginner
Практиковаться сейчас

Введение

Сервису заказов нужно принять задание сейчас и обработать его позже. Вы создадите очередь, получите задание, запустите предоставленный обработчик и подтвердите сохранённый заказ перед подтверждением сообщения.

Сначала выполните Чтение и запись DynamoDB из Lambda и её предварительные пошаговые работы. Эта независимая VM предоставляет обработчик, его ограниченную роль, пустую таблицу заказов и эталонные данные; очередь или задание не подготовлены.

Связь с сертификацией

Эта лабораторная работа помогает на практике изучить следующие темы экзаменов.

Создание независимой очереди заданий

На этом шаге создайте пустую очередь и проверьте предоставленный обработчик до отправки любого задания.

Используйте AWS View рядом с Terminal, чтобы сравнивать текущие очереди, результаты обработчика и сохранённые заказы. Сохраните несвязанные эталонные данные.

Amazon Simple Queue Service (SQS) хранит задания как сообщения для потребителя. Производитель отправляет задания, а потребитель обрабатывает их. Очередь разделяет время их работы: производителю не нужно ждать завершения потребителя. Очередь Standard может доставить сообщение больше одного раза; получение и подтверждение — отдельные операции.

Начните в подготовленном рабочем каталоге:

cd /home/labex/project

Проверьте предоставленный обработчик и пустую таблицу заказов. Обработчик рассчитывает 250 центов за единицу плюс сбор 100 центов. Его роль выполнения может записывать только в таблицу заказов; эталонная таблица содержит несвязанные данные, которые нужно сохранить.

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

Ожидайте пустой список записей. Создайте свою очередь. --query QueueUrl --output text выбирает её адрес как обычный текст; $(...) сохраняет этот вывод в переменной оболочки QUEUE_URL для последующих команд.

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

Тайм-аут видимости даёт потребителю 300 секунд до того, как полученное сообщение сможет снова стать доступным. Это временное скрытие, а не удаление. В следующей работе мы изучим истечение тайм-аута и повторную доставку.

Проверьте идентификацию очереди и текущие счётчики:

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

Ожидайте VisibilityTimeout равным 300 и оба счётчика сообщений равными 0. Счётчики — приблизительные операционные сигналы, а не гарантия завершения бизнес-операции. В AWS View ваша очередь появляется с нулём доступных и нулём обрабатываемых заданий; предоставленная Lambda не имеет выполнений, а таблица заказов по-прежнему пуста.

Пример подробностей очереди в официальной консоли Amazon SQS

Официальная консоль показывает те же имя очереди, тип, URL и ARN, которые вы проверяете через CLI. Это примеры значений; продолжайте со своим QUEUE_URL. Используйте AWS View для наблюдения ресурсов этой работы.

Источник: AWS SQS.

Отправка и получение задания заказа

На этом шаге отправьте задание и получите его, чтобы увидеть различие между доступными и обрабатываемыми сообщениями.

Доставка очереди и бизнес-результат

Получите, обработайте, затем подтвердите: удаляйте сообщение очереди только после подтверждения сохранённого заказа, используя актуальный дескриптор получения.

Тело сообщения — данные приложения. SQS хранит JSON как текст; ваш потребитель должен интерпретировать его. Отправьте одно небольшое синтетическое задание заказа:

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

Ответ включает MessageId и MD5OfMessageBody. Идентификатор сообщения определяет сообщение; MD5 представляет контрольную сумму байтов тела. Это подтверждает принятие очередью, а не завершённый заказ. Теперь AWS View показывает одно доступное задание, а таблица заказов остаётся пустой.

Получите одно сообщение и сохраните ответ. > перенаправляет вывод в received.json, не отображая его. --wait-time-seconds 5 допускает короткое ожидание длительного опроса, если задание не доступно немедленно.

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

Прочитайте безопасное тело приложения и число получений через jq, который выбирает поля из JSON:

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

Ожидайте тело с queue-order и количеством 2 и число получений 1 при первом получении. Полный ответ также содержит дескриптор получения: значение для этой конкретной попытки доставки. При подтверждении сообщения вы будете использовать самый последний дескриптор.

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

Ожидайте 0 доступных и 1 невидимое сообщение. В AWS View задание находится в обработке, но заказа ещё нет. Получение не обработало и не удалило его. Перейдите к следующему шагу в течение 300 секунд. Если чтение займёт больше времени, получите его заново в тот же файл, чтобы получить актуальный дескриптор получения перед обработкой и удалением.

Пример AWS View: одно задание находится в обработке, а выполнения обработчика и сохранённого заказа ещё нет

Этот действительный пример показывает доставку до обработки. Идентификаторы сообщений в вашем рабочем каталоге отличаются.

Обработка задания перед его подтверждением

На этом шаге обработайте полученное тело, проверьте сохранённый заказ, затем подтвердите сообщение.

Используйте действительно полученное тело как входные данные обработчика. fromjson преобразует строку JSON внутри ответа SQS в объект JSON; перенаправление записывает этот объект в job.json.

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

Предоставленная Lambda принимает этот объект заказа. Как и в курсе Lambda, fileb://job.json отправляет байты файла, а файл, указанный последним, получает ответ функции. Вызовите обработчик:

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

Один успешный статус API Invoke не подтверждает успешную обработку. Проверьте тело ответа:

cat worker-response.json

Ожидайте processed: true, количество 2 и total_cents: 600. Затем прочитайте сохранённую запись, не полагаясь только на возвращённое функцией сообщение:

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

Ожидайте queue-order, количество 2 и сумму 600. AWS View показывает реальные входные данные и результат обработчика и тот же сохранённый заказ. Задание остаётся в обработке до вашего подтверждения. Если ответ обработчика или сохранённая запись неверны, сохраните сообщение для диагностики, не удаляя его.

После подтверждения заказа выберите актуальный дескриптор получения как обычный текст и удалите эту доставку из очереди:

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

Успешное удаление обычно ничего не выводит. Прочитайте счётчики снова:

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

Оба счётчика должны быть 0. AWS View показывает пустую очередь и один сохранённый заказ. Вы разделили принятие очередью, временную доставку, бизнес-обработку и подтверждение. В реальных приложениях очередь Standard всё ещё может доставлять сообщения повторно; эта последовательность не является сквозной гарантией ровно одного выполнения. Последующие работы обучают устойчивой защите от дубликатов.

Очистка только своей очереди и результатов

На этом шаге удалите свою очередь, результат и журналы, сохранив предоставленные ресурсы.

Удалите очередь и созданный вами заказ, сохранив предоставленный обработчик, структуры таблиц и эталонные данные. Удаление очереди отбрасывает все оставшиеся задания, поэтому сначала подтвердите успешное завершение предыдущего шага.

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

Выполнение обработчика создало группу CloudWatch Logs. Удалите журналы выполнения этой работы как часть очистки:

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

Проверьте состояние ресурсов успешными запросами сервисов:

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

Не должно остаться URL очередей, список записей заказов должен быть пуст, а эталонная запись по-прежнему должна содержать keep unchanged. AWS View показывает отсутствие очередей, заказов и журналов выполнения с сохранением предоставленного обработчика и эталона. Ошибка аутентификации или сети не доказывает успешное удаление.

Удалите обычные файлы ответов после проверки ресурсов:

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

Используйте проверку шага перед завершением своей среды.

Резюме

Вы создали очередь SQS Standard, отправили и получили задание заказа JSON, проверили действительную обработку Lambda и сохранённую запись DynamoDB и подтвердили сообщение его дескриптором получения. Вы различили принятие, доставку в обработку и завершение бизнес-операции, затем удалили свою очередь, заказ и журналы выполнения, сохранив предоставленные ресурсы.