2016-11-06 55 views
5

有沒有其他人解決了以下問題?
我已經SNS話題充滿事件從S3並有其訂閱關於這一主題,當事件的千都投入到這個話題,lambda函數,是因爲超過併發的限制節流lambda函數
我不希望爲併發執行請求增加限制,但我會減少主題中的併發消耗,但是我沒有找到如何執行此操作的信息。謝謝。如何限制話題的消費率?

回答

5

關於SNS幾個選項:

1)SNS最大接收速率

設置SNS Maximum Receive Rate。這將抑制發送給訂閱者的SNS消息,但如果您有太多消息以致它們在被處理之前將被丟棄,則這可能不是一個好選擇。從文檔:

您可以設置每秒,亞馬遜SNS 通過設置最大發送到訂閱端點的消息的最大數量的接收速率 設置。亞馬遜SNS將等待遞送的消息保存爲 達1小時。放置超過一小時的消息將被丟棄。

如果您一次只能獲得數千個事件,那麼將Lambda的default concurrent execution limit的最大接收率設置爲'100'可能值得一試。

正如@kndrk所指出的那樣,此限制目前僅適用於SNS主題的HTTP/HTTPS訂戶。要解決此問題,您可以expose your lambda function via AWS API Gateway並將該端點訂閱到SNS主題,而不是直接將lambda函數訂閱。從SQS

Subscribe an SQS queue to the SNS topic和處理消息從隊列中,而不是直接從SNS主題

2)過程。 SQS ReceiveMessage的一次調用一次只能處理10條消息,因此您可以更輕鬆地進行調節。


還值得一提的是,你可以發佈S3 Events directly to AWS Lambda

+0

感謝您快速回答。當我在S3觸發lambda時嘗試瞭解決方案,但同樣的問題已經發生,因此我決定嘗試組合S3-> sns-> lambda。我會嘗試你的第一個選擇,它可能適合我。 ** P.S **我想立即處理來自S3的事件,因爲在大多數情況下,負載不是很高,但如果我理解正確,lambda不能由SQS事件觸發。只有這樣才能計劃執行lambda函數以便從SQS消耗 – nikolayandr

+0

這是正確的 - 對於SQS,您將基本上按計劃輪詢來自lambda的SQS RecieveMessage,而不是將其插入到特定的觸發器中。這聽起來像是從你的評論中看出,SNS最大接收率對你的用例來說非常合適。希望可以幫助你! –

+1

不幸的是,這隻適用於HTTP(s)端點。 Lambda訂戶完全不受限制。 – knrdk