Я разобрался в проблеме.Инициирование событий функции лямбда-очереди SQS работает иначе, чем я думал.Сообщения помещаются в функцию Lambda, а не вытягиваются ею.Я думаю, что это может быть улучшено AWS, но это то, что есть.
Проблема заключалась в том, что Default Visibility Timeout
было установлено на 30 секунд, а Reserved Concurrency
установлено на 1. Когда очередь SQS быстро заполняетсяс тысячами записей AWS начинает отправлять сообщения в функцию Lambda со скоростью, превышающей скорость, с которой один экземпляр функции может их обработать.AWS «предполагает», что он может просто раскрутить больше экземпляров Lambda, чтобы не отставать от противодавления.Однако ограничение параллелизма не позволяет ему раскручивать больше экземпляров - функция Lambda ограничена.В результате функция начинает возвращать сбой в серверную часть AWS для некоторых сообщений, что, следовательно, скрывает ошибочные сообщения в течение 30 секунд (настройка по умолчанию) и помещает их обратно в очередь после этого периода для повторной обработки.Поскольку для одного экземпляра необходимо обработать так много записей, через 30 секунд функция Lambda все еще занята и не может снова обработать эти сообщения.Таким образом, ситуация повторяется, и сообщения возвращаются в невидимость на 30 секунд.Это повторяется всего 3 раза.После третьей попытки сообщения отправляются в очередь недоставленных сообщений (таким образом мы настроили нашу очередь SQS).
Чтобы решить эту проблему, мы увеличили значение Default Visibility Timeout
до 5 минут.Этого времени достаточно для того, чтобы лямбда-функция обрабатывала большинство сообщений в очереди, в то время как отказавшие ожидают в невидимости.Через 5 минут они возвращаются в очередь, и поскольку функция Lambda больше не занята, она будет обрабатывать большинство из них.Некоторым из них нужно дважды перейти в невидимость, прежде чем они будут успешно обработаны.
Таким образом, для решения этой проблемы нужно либо увеличить Default Invisibility Timeout
, как мы, либо увеличить количество сбоев, необходимых для того, чтобы сообщение дошло до мертвых.Очередь писем.
Надеюсь, это кому-нибудь поможет.