У меня есть эта схема для получения 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 минуту (например), когда экземпляр будет готов. На мой взгляд, это лучшее решение на данный момент, простое и эффективное, но я не знаю, как его реализовать. Я знаю, что вы можете запланировать выполнение Lambda, но есть что-то вроде «выполнять эту функцию все дни в 15:00», и я хочу выполнить функцию только один раз с задержкой.
Я застрял в этом, надеюсь, кто-то сможет прояснить мои идеи.
Воспользуйтесь решением SQS.
Когда ваша функция Lambda выполняется, сохраните запрос в SQS.
Используйте автоматическое масштабирование для запуска и завершения вашего экземпляра EC2 по мере добавления запросов в очередь.
На вашем экземпляре EC2 опросите очередь SQS на предмет работы. Вы можете минимизировать затраты на SQS, минимизируя запросы:
Запросы SQS не так уж дороги. Ежеминутный опрос дает 43 200 запросов в месяц. Это намного меньше 1 миллиона запросов, которые вы получаете бесплатно каждый месяц. Даже если не покрывается уровнем бесплатного пользования, первый миллион запросов стоит всего 0,50 доллара США.