Повторные попытки и повторные попытки «тайм-аут» могут быть настроены непосредственно в очереди SQS.
При создании очереди установите следующие атрибуты:
Тайм-аут видимости по умолчанию будет временем, когда сообщение будет скрыто , как только оно будет получено вашим приложением.Если во время запуска лямбды происходит сбой сообщения и генерируется исключение, лямбда не удалит ни одного из сообщений в пакете, и все они в конечном итоге вновь появятся в очереди.
Если вы хотите попробовать только 3 раза, вы должны установить политику перезапуска SQS (очередь недоставленных сообщений AKA)
Политика перезапускапозволит вашей очереди перенаправлять сообщения в очередь недоставленных сообщений (DLQ) после повторного появления сообщения в очереди N
количество раз, где N
- это число от 1 до 1000.
Важно понимать, что лямбда будет продолжать обрабатывать сообщение об ошибке (сообщение, которое генерирует исключение в коде) до тех пор, пока:
- не будет обработано без ошибок (лямбда удалит сообщение)
- Срок действия
Message Retention Period
истекает (SQS удаляет сообщение) - Он отправляется на DLQ, установленный в политике перезапуска очереди SQS (SQS "перемещает" сообщение в DLQ)
- Вы удаляете сообщение изочередь в вашем коде (пользователь удаляет сообщение)
В противном случае Lambda не избавится от этого плохого сообщения.
Важные замечания
Lambda не будетиметь дело с ошибочными сообщениями
Основываясь на нескольких экспериментах, которые я провел, чтобы понять поведение интеграции SQS (документация при повторных попытках является неоднозначной ATM), lambda не будет удалять ошибочные сообщения и будетпродолжайте пробовать их снова.Даже если у вас настроен Lambda DLQ, сообщения не будут отправляться в DLQ, он полностью полагается на конфигурацию очереди SQS для этой цели, как указано в документации lambda DLQ .
Рекомендация:
- Всегда используйте политику повторного вождения в своей очереди SQS.
Исключения приводят к сбою целого пакета сообщений
Как я уже говорил ранее, если во время обработки сообщения в вашем коде есть исключение, вся партия сообщений повторяется, не имеет значения, были ли некоторые сообщения обработаны правильно.Если по какой-либо причине произошел сбой в нисходящем сервисе, вы можете в конечном итоге увидеть сообщения, которые были обработаны в DLQ.
Рекомендация:
- Вручную удалите сообщения, которые былиобработано правильно
- Убедитесь, что ваша лямбда-функция может обрабатывать одно и то же сообщение более одного раза
Ограничения лямбда-параллелизма и SQS побочные эффекты
Сообщение в блоге "Пределы лямбда-параллелизма и триггеры SQS плохо сочетаются (иногда)"описывает, как, если ваш предел параллелизма установлен слишком низко, лямбда может привести к тому, что пакеты сообщений будут подавлены, а полученная попытка можно увеличивать, даже не обрабатывая.
Рекомендация:
Сообщение и рекомендации Amazon:
- Установите видимость очередитайм-аут, по крайней мере, в 6 раз превышающий тайм-аут, настроенный для вашей функции.
- Дополнительное время позволяет Lambda повторить попытку, если выполнение вашей функцииОтрегулировано, пока ваша функция обрабатывает предыдущий пакет.
- Установите для maxReceiveCount в политике перенаправления очереди значение не менее 5. Это поможет избежать отправки сообщений в очередь недоставленных сообщений из-за регулирования.
- Сконфигурируйте недоставленное письмо так, чтобы сохранять сообщения о сбоях достаточно долго, чтобы вы могли переместить их позже для последующей обработки