[英]Can I limit concurrent invocations of an AWS Lambda?
我有一個 Lambda function 由 PUT 觸發到 S3 存儲桶。
我想限制這個 Lambda function 以便它一次只運行一個實例——我不希望兩個實例同時運行。
我已經查看了 Lambda 配置和文檔,但看不到任何明顯的內容。 我可以編寫自己的鎖定系統,但如果這已經是一個已解決的問題,那就太好了。
如何限制 Lambda 的並發調用數?
AWS Lambda現在支持各個功能的並發限制: https : //aws.amazon.com/about-aws/whats-new/2017/11/set-concurrency-limits-on-individual-aws-lambda-functions/
我建議你使用Kinesis Streams (或者DynamoDB + DynamoDB Streams ,它們基本上具有相同的行為)。
您可以將Kinesis Streams視為隊列 。 好的部分是你可以使用Kinesis Stream作為Lambda函數的觸發器 。 因此,插入此隊列的任何內容都將按順序自動傳遞給您的函數。 因此,您將能夠逐個處理這些S3事件 ,一個Lambda執行一個接一個地執行 (一次一個實例)。
為此,您需要創建一個Lambda函數,其簡單目的是獲取S3 Events並將它們放入Kinesis Stream中 。 然后,您將Kinesis Stream配置為Lambda觸發器 。
當您將Kinesis Stream配置為Lambda觸發器時,我建議您使用以下配置:
有關AWS May網絡研討會系列的更多信息- 使用Amazon Kinesis和AWS Lambda進行流數據處理 。
我希望這可以幫助任何有類似問題的人。
PS請記住, Kinesis Streams有自己的定價 。 使用DynamoDB + DynamoDB流可能會更便宜(甚至免費,因為DynamoDB的非過期免費層 )。
不,這是我非常希望看到Lambda支持的事情之一,但目前還沒有。 其中一個問題是,如果發生了大量的S3 PUT操作,AWS必須以某種方式排隊所有Lambda調用,並且目前不支持這種情況。
如果您在Lambda函數中構建了一個鎖定機制,那么對於由於鎖定而未處理的請求,您將如何處理? 你會把那些S3通知扔掉嗎?
大多數人建議的解決方案是讓S3將通知發送到SQS隊列,然后將Lambda函數安排為定期運行,例如每分鍾一次,並檢查隊列中是否有需要處理的項目。
或者,讓S3將通知發送到SQS並且只有一個t2.nano EC2實例,其中單線程服務輪詢隊列。
我知道這是一個舊線程,但我遇到了它試圖弄清楚如何確保我的時間排序的 SQS 消息按順序處理,從 FIFO 隊列中出來,而不是通過多個 Lambda 同時/亂序處理線程運行。
根據文檔:
對於 FIFO 隊列,Lambda 按照接收消息的順序將消息發送到您的 function。 當您將消息發送到 FIFO 隊列時,您指定了一個消息組 ID。 Amazon SQS 確保同一組中的消息按順序傳遞到 Lambda。 Lambda 將消息分組,一次只發送一批。 如果您的 function 返回錯誤,則 function 會在 Lambda 收到來自同一組的其他消息之前嘗試對受影響的消息進行所有重試。
您的 function 可以並發擴展到活動消息組的數量。
鏈接: https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html
所以基本上,只要您使用 FIFO 隊列並提交需要使用相同 MessageGroupID 保持順序的消息,SQS/Lambda 會自動處理排序,無需任何額外設置。
讓S3“Put events”導致消息放在隊列中(而不是涉及lambda函數)。 該消息應包含對S3對象的引用。 然后安排一個lambda到“SHORT POLL整個隊列”。
PS: S3事件不能觸發Kinesis Stream ...只有SQS,SMS,Lambda(參見http://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html#supported-notification-destinations )。 Kinesis Stream價格昂貴,用於實時事件處理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.