AWS Solutions Architect · Урок

Тайм-аут видимости, DLQ и длительный опрос

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

Урок 2 из 413 шагов

«Тайм-аут видимости, DLQ и длительный опрос» — бесплатный урок AWS Solutions Architect на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения AWS Solutions Architect, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс AWS Solutions Architect содержит 4 уроков всего.

Механизм времени ожидания видимости

Когда потребитель получает сообщение из SQS, оно скрывается от всех остальных потребителей на период, называемый временем ожидания видимости. В течение этого периода потребитель обрабатывает сообщение, а затем удаляет его. Если потребитель завершает работу с ошибкой или не успевает завершить обработку, время ожидания видимости истекает, и сообщение снова становится видимым, поэтому его может получить другой потребитель. Это основной механизм, обеспечивающий гарантию доставки SQS как минимум один раз.

Настройка времени ожидания видимости

Время ожидания видимости по умолчанию составляет 30 секунд. Его можно установить в диапазоне от 0 секунд до 12 часов. Установите значение, которое с запасом превышает максимально ожидаемое время обработки: если обработка занимает до 2 минут, задайте время ожидания не менее 3–4 минут. Также можно изменить время ожидания для отдельной квитанции с помощью change-message-visibility. Это полезно, когда потребитель понимает, что ему нужно больше времени для завершения обработки конкретного сообщения.

# Extend visibility timeout for a specific message
aws sqs change-message-visibility \
  --queue-url 'https://sqs.us-east-1.amazonaws.com/123456789012/MyQueue' \
  --receipt-handle 'AQEBwJnKyrHigUMZj...' \
  --visibility-timeout 300

Слишком короткое и слишком длинное время ожидания

Если установить время ожидания слишком коротким, сообщения появятся снова до завершения обработки потребителем, что приведёт к повторной обработке. Если установить его слишком длинным, другой потребитель не сможет получить сообщение, если исходный потребитель незаметно завершит работу (например, из-за сбоя экземпляра EC2 без корректного завершения). Оптимальное время ожидания должно быть немного больше времени обработки на 99-м процентиле, но достаточно коротким, чтобы быстро восстанавливаться после сбоев потребителей. Следите за метрикой CloudWatch ApproximateNumberOfMessagesNotVisible, чтобы выявлять проблемы с временем ожидания.

Очереди недоставленных сообщений

Очередь недоставленных сообщений (DLQ) — это отдельная очередь SQS, куда сообщения отправляются после заданного числа неудачных попыток обработки (maxReceiveCount). Когда число получений сообщения превышает maxReceiveCount, SQS автоматически перемещает его в DLQ. DLQ не позволяет сообщениям-«отравленным пилюлям» (сообщениям, обработка которых всегда завершается ошибкой) бесконечно блокировать очередь. Сообщения в DLQ можно проверять, отлаживать и повторно воспроизводить после исправления ошибки обработки.

Настройка очереди недоставленных сообщений

DLQ — это обычная очередь SQS (Standard для исходной очереди Standard и FIFO для исходной очереди FIFO). В исходной очереди настройте политику повторной отправки, указав, какая очередь является DLQ, и порог maxReceiveCount. Убедитесь, что срок хранения сообщений в DLQ больше срока хранения в исходной очереди: сообщения поступают в DLQ с задержкой, и Вам потребуется время на их исследование до истечения срока хранения.

aws sqs set-queue-attributes \
  --queue-url 'https://sqs.us-east-1.amazonaws.com/123456789012/MyQueue' \
  --attributes '{
    "RedrivePolicy": "{\"deadLetterTargetArn\": \"arn:aws:sqs:us-east-1:123456789012:MyDLQ\", \"maxReceiveCount\": \"5\"}"
  }'

Мониторинг DLQ и настройка оповещений

Настройте оповещение CloudWatch для метрики ApproximateNumberOfMessagesVisible очереди DLQ. Любое сообщение, поступившее в DLQ, указывает на требующую внимания ошибку обработки. Настройте оповещение так, чтобы оно немедленно запускало уведомление SNS дежурному инженеру. Рассматривайте каждое сообщение в DLQ как ошибку, требующую исследования: сообщения не должны незаметно накапливаться в DLQ. После исправления ошибки используйте повторную отправку из DLQ, чтобы вернуть сообщения в исходную очередь для повторной обработки.

Повторная отправка из DLQ: воспроизведение сообщений

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

# Start DLQ message move task
aws sqs start-message-move-task \
  --source-arn 'arn:aws:sqs:us-east-1:123456789012:MyDLQ' \
  --destination-arn 'arn:aws:sqs:us-east-1:123456789012:MyQueue' \
  --max-number-of-messages-per-second 5

Короткий и длительный опрос

По умолчанию SQS использует короткий опрос: вызов receive-message проверяет случайное подмножество серверов и сразу возвращает ответ, даже если доступных сообщений нет. Это приводит к большому числу пустых ответов и напрасным вызовам API. Длительный опрос ожидает поступления сообщения до 20 секунд, прежде чем вернуть пустой ответ. Длительный опрос значительно снижает затраты (требуется меньше вызовов API) и уменьшает задержку: сообщение будет получено сразу после поступления, максимум на 20 секунд раньше следующего цикла опроса.

Включение длительного опроса

Включите длительный опрос на уровне очереди (он применяется ко всем вызовам получения) или для отдельного запроса. Для большинства приложений рекомендуется настроить на уровне очереди параметр ReceiveMessageWaitTimeSeconds со значением 20. Когда Lambda использует SQS в качестве источника событий, длительный опрос включается автоматически. Для потребителей на базе EC2 задайте WaitTimeSeconds в вызове receive-message.

# Enable long polling at queue level (recommended)
aws sqs set-queue-attributes \
  --queue-url 'https://sqs.us-east-1.amazonaws.com/123456789012/MyQueue' \
  --attributes '{"ReceiveMessageWaitTimeSeconds": "20"}'

# Or per-request
aws sqs receive-message \
  --queue-url 'https://...' \
  --wait-time-seconds 20 \
  --max-number-of-messages 10

Атрибуты сообщений и фильтрация

Сообщения SQS могут содержать атрибуты сообщений — пары «ключ–значение» с метаданными, отдельные от тела сообщения. У атрибутов есть тип (строка, число, двоичные данные) и значение. Когда SQS подписана на тему SNS, можно использовать политики фильтрации подписки SNS, применяемые к атрибутам сообщений, чтобы направлять в каждую очередь только релевантные сообщения. Без фильтрации каждый подписчик SQS получает каждую публикацию SNS независимо от её содержимого.

Очереди задержки и таймеры сообщений

Очередь задержки делает каждое новое сообщение невидимым на период от 0 до 15 минут после его отправки. Это полезно для рабочих процессов, в которых потребитель не должен обрабатывать сообщение сразу, например когда сначала необходимо дождаться завершения зависимого процесса. Также можно задать задержку для отдельного сообщения с помощью параметра DelaySeconds при отправке; она переопределит задержку на уровне очереди. Примечание: очереди задержки недоступны для очередей FIFO.

# Create a delay queue (5 minute delay)
aws sqs create-queue \
  --queue-name 'DelayedProcessingQueue' \
  --attributes '{"DelaySeconds": "300"}'

Быстрая проверка

Проверьте, насколько хорошо Вы поняли концепции AWS Solutions Architect (SAA-C03) из этого урока.

Итоги урока

В этом уроке Вы узнали, что тайм-аут видимости скрывает сообщение от других потребителей во время обработки, обеспечивая доставку как минимум один раз с автоматической повторной доставкой при сбое потребителя; очереди недоставленных сообщений сохраняют сообщения, обработка которых неоднократно завершается ошибкой, чтобы их можно было отладить и повторно воспроизвести после исправления ошибки; а длительный опрос (ожидание до 20 секунд) снижает затраты на API и задержку по сравнению с коротким опросом. Далее мы рассмотрим темы SNS и архитектуру широковещательной рассылки.

Можно начать бесплатно

Изучай AWS Solutions Architect с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
30
Уроки
120

Часто задаваемые вопросы

Урок «Тайм-аут видимости, DLQ и длительный опрос» бесплатный?

Да — полный текст урока «Тайм-аут видимости, DLQ и длительный опрос» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс AWS Solutions Architect, подпишись на CoddyKit PRO. Курс AWS Solutions Architect содержит 4 уроков всего.

Чему я научусь в уроке «Тайм-аут видимости, DLQ и длительный опрос»?

Настройте тайм-ауты видимости, чтобы сообщения не обрабатывались дважды, направляйте сообщения с ошибками в очередь недоставленных сообщений и снижайте затраты с помощью длительного опроса. Ты практикуешь AWS Solutions Architect с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать AWS Solutions Architect?

Предыдущий опыт не требуется. AWS Solutions Architect на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Тайм-аут видимости, DLQ и длительный опрос»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке AWS Solutions Architect?

Да. Каждый урок AWS Solutions Architect включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Очереди SQS Standard и FIFO
  2. Тайм-аут видимости, DLQ и длительный опрос
  3. Темы SNS и архитектура веерной рассылки
  4. Фильтрация сообщений SQS и интеграция SNS + SQS
← Назад к AWS Solutions Architect