Лямбда-триггер SQS с расширением времени ожидания видимости

#amazon-web-services #aws-lambda #amazon-sqs

Вопрос:

Я работаю над решением, в котором у меня есть очередь SQS с триггером Лямбда. Насколько я понимаю, Lambda будет получать сообщения в пакетах для обработки, и как только функция Lambda будет выполнена успешно, сообщения в очереди SQS автоматически удаляются. Однако как я могу разрешить удаление только некоторых из этих сообщений?

Давайте предположим такой вариант использования: лямбда-функция получает пакет из 10 сообщений, и только 7 сообщений являются допустимыми и могут быть обработаны, а остальные 3 сообщения необходимо обработать позже.

Моя первоначальная мысль заключалась в том, что я мог бы обновить тайм-аут видимости boto3.sqs.change_visibility_timeout для каждого из 3 сообщений, чтобы он был обработан после тайм-аута, однако, поскольку в целом выполнение функции лямбда успешно, все 10 сообщений удаляются из очереди SQS.

Есть какие-нибудь предложения?

Ответ №1:

Да, по умолчанию функция Lambda удаляет все сообщения при успешном выполнении. Вам нужно будет обработать это в своем коде, но не путем изменения времени ожидания видимости сообщений.

Добавьте DLQ (очередь с мертвыми буквами), которая фактически будет обрабатывать неудачные сообщения (сообщения отправляются в DLQ после определенного количества неудачных попыток обработки, в зависимости от того, как вы его настроили).

Здесь у вас есть несколько вариантов:

  1. Вы можете самостоятельно обрабатывать каждый элемент и удалять успешно обработанные сообщения. В случае неудачного сообщения вы можете выдать сообщение об ошибке, и оно не будет автоматически удалено функцией lambda
  2. Если вы используете JavaScript, вы можете попробовать с Middy
  3. Если вы используете Python, вы можете использовать Lambda Powertools Python

Комментарии:

1. Спасибо вам за ваш ответ. Похоже, что Лямбда-инструменты-это то, что я искал. Основываясь на моем понимании лямбда-инструментов, я должен по-прежнему использовать лямбда-триггер SQS и самостоятельно обрабатывать каждый элемент, позволяя удалять успешно обработанные сообщения, а те, которые не были удалены, не удаляться?

2. Да, это верно