簡體   English   中英

AWS Lambda | 如何回滾由於執行超時而導致的數據庫更改

[英]AWS Lambda | How to rollback database changes due to execution timeout

我的團隊正在處理 AWS Lambda function,其配置的超時為 30 秒。 鑒於 lambda 具有此超時約束並且它們可以重復用於后續請求的事實,似乎函數的執行總是有可能在完成其所有必要步驟之前超時。 這是一個正確的假設嗎? 如果是這樣,我們如何在彈性中烘焙,以便在更新記錄后發生超時的情況下回滾數據庫更新,但響應尚未返回給函數的調用者?

更具體地說,我的團隊正在管理一個基於 Javascript 的 lambda (Node.js 16.x),它位於 Api 網關后面,是一個 REST 方法的實現,用於檢索和更新工作記錄。 該方法的工作原理是在特定條件下從 DynamodDB 中檢索記錄,更新它們的狀態,然后將更新后的作業記錄返回給調用者。 有沒有辦法檢測何時發生超時並回滾(手動或自動)更新的數據庫記錄,以便它們與 lambda 開始執行時相同 state?

重要的是要考慮您在這里嘗試做的事情的后果。 最好的做法不是尋找方法來檢測您的 Lambda function 何時即將過期,而是首先監視大量已執行的請求並分析完成這些請求平均需要多少時間。 也許 30 秒可能不足以完成作為 Lambda function 實現的交易。

一旦您使用適合請求平均執行時間的可接納超時,您就可以通過DynamoDB 中的事務支持將由於執行不完整而導致回滾的可能性降至最低。 它允許您將多個操作組合在一起,並將它們作為一個單一的全有或全無提交,從而確保原子性。

與您的實施設計相關的另一個方面是,在不影響超時的情況下,您可以多快地從 DynamoDB 檢索數據。 目前,您的代碼從 DynamoDB 檢索記錄,然后在滿足特定條件時更新它們。 這就需要盡快進行此讀取,以便可以開始后續更新操作。 加快此讀取速度的一種方法是啟用 DAX(DynamoDB 加速器)以實現內存加速。 這充當具有微秒延遲的 DynamoDB 的緩存。

最后,如果你要格外小心,甚至沒有在 DynamoDB 中啟動事務,因為沒有足夠的時間這樣做,你可以使用上下文 object 來自 Lambda API 來查詢 function 的剩余時間。在Node.js ,你可以這樣做:

let remainingTimeInMillis = context.getRemainingTimeInMillis()
if (remainingTimeInMillis < TIMEOUT_PASSED_AS_ENVIRONMENT_VARIABLE) {
   // Cancel the execution and clean things up
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM