1

我有這樣的設置爲什麼DynamoDBStream不能並行觸發lambda函數?

ApiGateway - > Lambda1 - > DynamoDB - > Lambda2 - > SNS - > SQS

這裏是我在嘗試做:

  1. 一個HTTP請求ApiGateway。
  2. ApiGateway與Lambda1集成,因此Lambda1得到執行。
  3. Lambda1將對象插入DynamoDB。
  4. DynamoDBStream觸發Lambda2。批量大小爲100.
  5. Lambda2會爲每個插入的記錄發佈一條消息給SNS。
  6. SQS訂閱了SNS。

基本上,如果我向Api網關發出一個http請求,我希望看到一條消息以SQS結尾。實際上,對於單個請求,一切都按預期工作。

我做了這個測試:

  1. 讓10 HTTP請求熱身lambda函數,並等待30秒。
  2. 創建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函數並行?我是否缺少配置?

解決方案

從答案採取建議和意見後,這裏是我的解決方案。

  1. 我在發佈每封郵件之前重新創建了SNS客戶端。我把它變成了我的類中的一個靜態變量,並且Lambda2在大約15秒內開始執行。
  2. 然後,我將DynamoDB觸發器的批處理大小增加到1000.
  3. I處理的內部Lambda2(發佈到SNS)DynamoDB記錄並行使用10個線程。
  4. 增加了從192MB到512MB的Lambda2內存分配。

通過這些優化,我可以看到SQS中的所有10000條消息,在所有http請求發送後的10-15秒內。

結論:)

爲了找到最佳(廉價&可接受的延遲)解決方案,我們需要與不同的批量大小,線程數,分配的內存等

+0

* Lambda2爲每個插入的記錄發佈消息給SNS *爲什麼Lambda2需要50-60秒?它還在做其他工作嗎? –

+0

謝謝@ Michael-sqlbot!我不確定爲什麼我不關注這一點。 –

回答

2

多次測試目前還沒有辦法觸發DynamoDBStream並行觸發。這只是一個順序交付和批量配置。

還沒有部分遞送。如果您有批量交付給您的lambda,則需要批量完成所有元素。否則,它將在稍後交付相同批次或更多記錄。

還需要成功完成拉姆達爲下一批次,如果出現了錯誤,它會反覆調用拉姆達,直到它被成功地交付或流中的數據的生命週期。

相關問題