#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 после определенного количества неудачных попыток обработки, в зависимости от того, как вы его настроили).
Здесь у вас есть несколько вариантов:
- Вы можете самостоятельно обрабатывать каждый элемент и удалять успешно обработанные сообщения. В случае неудачного сообщения вы можете выдать сообщение об ошибке, и оно не будет автоматически удалено функцией lambda
- Если вы используете JavaScript, вы можете попробовать с Middy
- Если вы используете Python, вы можете использовать Lambda Powertools Python
Комментарии:
1. Спасибо вам за ваш ответ. Похоже, что Лямбда-инструменты-это то, что я искал. Основываясь на моем понимании лямбда-инструментов, я должен по-прежнему использовать лямбда-триггер SQS и самостоятельно обрабатывать каждый элемент, позволяя удалять успешно обработанные сообщения, а те, которые не были удалены, не удаляться?
2. Да, это верно