less than 1 minute read

前言

當 Lambda 同時被大量觸發時,若沒有妥善處理共享資源(如 DynamoDB、S3、Certificate Pool),容易產生碰撞與重複使用問題。本文分享實務上如何透過 Optimistic Locking 與狀態欄位避免風險。

問題場景

在高併發環境下,多個 Lambda 實例可能同時:

  • 讀取相同的資源
  • 嘗試更新相同的記錄
  • 競爭有限的資源池

解決方案

1. Optimistic Locking

使用版本號控制,確保更新時資料未被其他程序修改:

response = table.update_item(
    Key={'id': resource_id},
    UpdateExpression='SET #status = :new_status, #version = :new_version',
    ConditionExpression='#version = :current_version',
    ExpressionAttributeNames={
        '#status': 'status',
        '#version': 'version'
    },
    ExpressionAttributeValues={
        ':new_status': 'IN_USE',
        ':new_version': current_version + 1,
        ':current_version': current_version
    }
)

2. 狀態欄位設計

定義明確的狀態流轉:

  • AVAILABLEIN_USERELEASED
  • 每次狀態變更都需要條件檢查

結論

在設計 Lambda 並發處理時,務必考慮資源競爭問題,善用 DynamoDB 的條件表達式可以有效避免資料不一致的情況。