Это не идеальная установка для запуска лямбда-функций SQS.
Мои тесты показывают, что сообщения, отправленные в SQS, будут немедленно запускать лямбда-функцию , даже если задана настройка задержки.Таким образом, помещение сообщения обратно в очередь SQS вызовет повторное срабатывание Lambda сразу после.
Чтобы избежать ситуации, когда Lambda постоянно проверяет, готово ли сообщение к обработке, я бы порекомендовал:
- Использование Amazon CloudWatch Events для запуска функции Lambda по расписанию (например, каждые 2 минуты)
- Функция Lambda должна извлекать сообщения из очереди и проверять, готовы ли они к обработке.
- Если они готовы, обработайте их и удалите
- Если они не готовы, а затем отправьте их обратно в очередь с задержкой 1019* установка и удаление исходного сообщения
Обратите внимание, что это отличается от того, чтобы SQS напрямую запускал Lambda.Вместо этого лямбда-функция должна вызывать ReceiveMessages()
, чтобы получить само сообщение (я), что позволяет функции задержки добавлять некоторое время между проверками.
Другой вариант: вместо повторной вставки сообщения в очередьВы можете просто воспользоваться установкой Default Visibility Timeout , удалив сообщение , а не .Сообщение, которое прочитано из очереди, но не удалено, автоматически «появится» в очереди.Вы можете использовать это как период повторных попыток.Однако это означает, что вам придется самостоятельно обрабатывать мертвые письма (например, если сообщение не может быть обработано после n попыток).