Запускают AWS Lambda, как только очередь SQS fifo не пуста

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

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

Вопрос:

У меня есть очередь SQS FIFO, я хочу знать, есть ли способ запустить AWS lambda, как только очередь не будет пустой. Например, если моя очередь пуста и новое сообщение вводит триггерную лямбду, но если очередь уже содержит хотя бы одно сообщение, и новое сообщение вводится, лямбда не будет запущена. Возможно ли это?

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

1. Вы хотите запустить функцию lambda только один раз, только для первого сообщения? И что происходит с последующими сообщениями?

2. @Marcin Да, я хочу знать, когда запускать службу для чтения из очереди, сообщения отправляются большими порциями. Служба будет обрабатывать все остальные сообщения, пока очередь не опустеет.

Ответ №1:

Существует метрика Amazon CloudWatch ApproximateNumberOfMessagesVisible , которая показывает количество сообщений в очереди. В документации говорится, что «для очередей FIFO результат является точным».

Вы можете создать аварийный сигнал CloudWatch, который срабатывает, когда количество сообщений падает до нуля в течение определенного периода времени. Тревога может отправить сообщение в раздел Amazon SNS. Если вы подпишете свою функцию AWS Lambda на этот раздел, она будет запущена, когда очередь будет пустой в течение указанного времени (например, в течение 5 минут). Он будет запущен только тогда, когда сигнал тревоги перейдет в состояние «Тревога», и он не будет запускаться снова, пока сигнал тревоги не выйдет из состояния и снова не войдет в состояние.

Важно: при настройке аварийного сигнала перейдите к дополнительной конфигурации и установите для обработки отсутствующих данных значение «Рассматривать отсутствующие данные как плохие (превышение порога)». Это необходимо, потому что очередь SQS не будет отправлять показатели, если очередь пуста. (Многие очереди пусты, так что это экономит много места для хранения метрик!)

Ответ №2:

Необычная картина.

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

Ответ №3:

Вы можете установить ограничение на одновременное выполнение равным 1, чтобы убедиться, что только 1 экземпляр lambda считывает очередь. Но я не уверен, что это то, что вы, возможно, захотите сделать. Lambda может считывать не более 10 сообщений за одно выполнение, и если в вашу очередь поступает слишком много входящих сообщений, процесс обработки сообщений может занять слишком много времени.