在Day 7: 設定 AWS SQS 為 Lambda 的 trigger 有提到要怎麼設定 AWS SQS 為 Lambda 的 trigger ,接下來要繼續討論,如何優化 Lambda 和 SQS 的設計,避免因為執行時發生 的 Exception ,造成 Lambda 多次觸發, message 囤積在 SQS 的問題。
因為 Lambda 有 retry 機制,所以當 Lambda 執行發生例外( Exception )時,該 message 會返回 SQS ,並重新排隊等待處理,這時候如果又有新的 message 被塞到 SQS 中,會不斷把 message 囤積在 SQS 的 queue ,最後會造成 queue 中的 message 累積過多, message 要經過很久的時間才會被執行。
而在 SQS 設定 Dead-letter queue 可以減緩這個問題,讓 message 在 retry 幾次之後,移到另外一個 queue ,原本的 queue 就可以不受這些失敗的 message 干擾,開發人員也能針對那些有問題的 message 進行 debug 或重新執行。
在這邊簡單設計一個實驗,證明 Lambda 的 Exception 真的會造成 message 囤積在 queue 的情況。首先,在 Lambda 的程式碼直接丟出 Exception 。
接下來把 13 個 message 丟到 queue,可以很清楚的在 SQS 的監控中看到,所有 message 都執行失敗的情況下,這 13 個 message 一直囤積在 queue 中。
首先,點選 Edit
對 queue 進行編輯。
接著,拉到 Dead-letter queue
那邊,並且選擇 Enable
,然後選擇另外一個 queue ,最後存檔就完成設定了。
設完 Dead-letter queue
之後,可以看到設定給 Lambda 當 trigger 的 SQS queue ,沒有一直重複接收執行失敗的 message ,堆積問題得到有效緩解。
接著到 Dead-letter queue
那邊,可以看到 Dead-letter queue
確實收到13個失敗的 message ,緩解了 Lambda Exception 造成 message 囤積在原本的 queue 的問題。
medium: 使用 SQS Dead Letter Queue 緩解 AWS Lambda Exception 造成 message 囤積在 SQS 的問題