Amazon-Ec2
延遲呼叫 Lambda 函式
我有這個架構來接收 http 請求並對 Windows Server EC2 實例下的文件進行一些處理。
API Gateway -> Lambda -> EC2 (Node.js + Express)
目前,每天有幾個請求,所以實例會停止,直到請求到來。當請求到來時,Lambda 函式會啟動實例*,但第一個請求會失去*。如果實例正在執行,則轉發請求。
我想要一個不會失去第一個請求的解決方案。我有幾種方法,但似乎沒有一種是正確的:
將該請求保存到ElastiCache (Redis/memcached)。在 Express 伺服器的啟動中,檢查是否保存了任何請求。
使用Amazon SQS儲存所有請求。然後為工作人員切換 Express API 以檢查 SQS 是否有新消息。我不喜歡這個解決方案,因為我會一直檢查一個 SQS,大部分時間都是空的,我想這可能很昂貴。
延遲重新呼叫Lambda函式。當實例準備就緒時,只需在 1 分鐘內(例如)使用相同的請求再次呼叫 Lambda 函式。這是我認為目前最好的解決方案,簡單有效,但我不知道如何實施。我知道您可以安排 Lambda 執行,但有“在下午 3 點全天執行此函式”之類的問題,我只想延遲執行一次該函式。
我堅持這一點,希望有人能澄清我的想法。
使用 SQS 解決方案。
當您的 Lambda 函式執行時,將請求儲存到 SQS。
當請求添加到隊列時,使用 Auto Scaling 啟動和終止您的 EC2 實例。
在您的 EC2 實例上,輪詢 SQS 隊列以進行工作。您可以通過最小化請求來最小化 SQS 成本:
- 使用長輪詢,和/或
- 每分鐘檢查一次隊列,在檢查之間睡覺。
SQS 請求並不昂貴。每分鐘輪詢一次將每月產生 43,200 個請求。這遠低於您每月免費獲得的 100 萬個請求。即使免費套餐未涵蓋,前一百萬個請求也只需 0.50 美元。