Вызвать лямбда-функцию с задержкой
У меня есть эта схема для получения запросов http и некоторой обработки файлов в экземпляре Windows Server EC2.
API Gateway -> Lambda -> EC2 (Node.js + Express)
На данный момент существует несколько запросов в день, поэтому экземпляр останавливается, пока не поступит запрос. Когда приходит запрос, функция Lambda запускает экземпляр, но первый запрос теряется. Если экземпляр запущен, запрос перенаправляется.
Я хочу решение, при котором я не теряю первый запрос. У меня есть несколько подходов, но ни один из них не кажется правильным:
1) Сохраните этот запрос в ElastiCache (Redis / memcached). При запуске сервера Express проверьте, сохранены ли какие-либо запросы.
2) Используйте Amazon SQS для хранения всех запросов. Затем переключите Express API для работника, чтобы проверить SQS на наличие новых сообщений. Мне не нравится это решение, потому что я буду постоянно проверять SQS, что большую часть времени будет пустым, и я полагаю, что это может быть дорого.
3) Повторно вызвать лямбда- функцию с задержкой. Просто сделайте еще один вызов функции Lambda с тем же запросом за 1 минуту (например), когда экземпляр будет готов. На мой взгляд, сейчас это лучшее решение, простое и эффективное, но я не знаю, как его реализовать. Я знаю, что вы можете планировать лямбда-выполнения, но есть что-то вроде "выполнить эту функцию все дни в 3 часа дня", и я хочу выполнить функцию только один раз с задержкой.
Я застрял с этим, надеюсь, кто-то может прояснить мои идеи.
1 ответ
Используйте решение SQS.
Когда ваша лямбда-функция выполняется, сохраните запрос в SQS.
Используйте автоматическое масштабирование, чтобы запустить и завершить работу экземпляра EC2, когда запросы добавляются в очередь.
На вашем экземпляре EC2 опросите очередь SQS для работы. Вы можете минимизировать затраты SQS, минимизируя запросы:
- Использовать длинный опрос и / или
- Проверяйте очередь раз в минуту, спя между проверками.
Запросы SQS не так дороги. Опрос один раз в минуту даст 43 200 запросов в месяц. Это значительно ниже 1 миллиона запросов, которые вы получаете бесплатно каждый месяц. Даже если уровень бесплатного обслуживания не покрывается, первый миллион запросов составляет всего $0,50.