我有這樣的設置爲什麼DynamoDBStream不能並行觸發lambda函數?
ApiGateway - > Lambda1 - > DynamoDB - > Lambda2 - > SNS - > SQS
這裏是我在嘗試做:
- 一個HTTP請求ApiGateway。
- ApiGateway與Lambda1集成,因此Lambda1得到執行。
- Lambda1將對象插入DynamoDB。
- DynamoDBStream觸發Lambda2。批量大小爲100.
- Lambda2會爲每個插入的記錄發佈一條消息給SNS。
- SQS訂閱了SNS。
基本上,如果我向Api網關發出一個http請求,我希望看到一條消息以SQS結尾。實際上,對於單個請求,一切都按預期工作。
我做了這個測試:
- 讓10 HTTP請求熱身lambda函數,並等待30秒。
- 創建100個主題。每個線程將發出http請求,直到請求總數爲10000.
測試的第二步在110秒內完成。我的DynamoDB配置爲每秒100次寫入,這110秒非常合理。 110秒後,我看到我的DynamoDB表中有這10000條記錄
問題是消息最終需要花費太多時間才能在SQS中結束。我檢查了Lambda2的日誌,我發現它在測試完成後仍會觸發30分鐘。同樣在Lambda2的日誌中,我看到了這種模式。
Start Request
Message published to SNS...
Message published to SNS...
[98 more "Message published to SNS..."]
End Request
日誌由這些線的重複。由於DynamoDBStream配置的批量大小爲100,因此100行「發佈的消息」是有意義的。對Lambda2的每個請求都需要50-60秒,這意味着所有消息都需要大約90分鐘才能在SQS中結束。
困擾我的是,每個「開始請求」都出現在「結束請求」之後。所以,根本原因好像DynamoDBStream不是並行觸發Lambda2。
問題
爲什麼DynamoDBStream不觸發lambda函數並行?我是否缺少配置?
解決方案
從答案採取建議和意見後,這裏是我的解決方案。
- 我在發佈每封郵件之前重新創建了SNS客戶端。我把它變成了我的類中的一個靜態變量,並且Lambda2在大約15秒內開始執行。
- 然後,我將DynamoDB觸發器的批處理大小增加到1000.
- I處理的內部Lambda2(發佈到SNS)DynamoDB記錄並行使用10個線程。
- 增加了從192MB到512MB的Lambda2內存分配。
通過這些優化,我可以看到SQS中的所有10000條消息,在所有http請求發送後的10-15秒內。
結論:)
爲了找到最佳(廉價&可接受的延遲)解決方案,我們需要與不同的批量大小,線程數,分配的內存等
* Lambda2爲每個插入的記錄發佈消息給SNS *爲什麼Lambda2需要50-60秒?它還在做其他工作嗎? –
謝謝@ Michael-sqlbot!我不確定爲什麼我不關注這一點。 –