認識 DynamoDB 中全域次要索引 (GSI) 的寫入限流與背壓現象 - Amazon DynamoDB

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

認識 DynamoDB 中全域次要索引 (GSI) 的寫入限流與背壓現象

GSI 背壓限流是 DynamoDB 中最複雜的限流情境之一,因其在寫入操作與限流之間形成間接關聯:應用程式雖寫入基礎資料表,卻因一或多個索引的容量受限而遭遇限流。

認識 GSI 背壓限流

當您對 DynamoDB 資料表進行寫入時,該表的任何全域次要索引 (GSI) 都會依「最終一致性模式」進行非同步更新。若 GSI 的容量不足以處理這些更新,DynamoDB 會對基礎資料表的寫入進行限流,以維持資料一致性。這種情況稱為 GSI 背壓。如需了解 GSI 的運作方式,請參閱 DynamoDB 全域次要索引

不同於直接資料表限流 (被存取的資源同時也是導致限流的資源),GSI 背壓會在基礎資料表與索引間建立相依關係。即使基礎資料表容量充足,若任一關聯 GSI 無法處理更新量,寫入仍會遭限流。此關係尤其重要,因為分割區層級限制會獨立套用於基礎資料表與每個 GSI,兩者皆具有各自的分割區結構與對應的輸送量上限。

GSI 的分割設計是依其分割區索引鍵決定,通常與基礎資料表的分割區索引鍵不同。即使基礎資料表的存取在各分割區間分佈均勻,GSI 更新仍可能集中於特定分割區,導致 GSI 產生熱點。如需了解資料表與 GSI 的分割區索引鍵設計最佳實務,請參閱 DynamoDB 分割區索引鍵設計

例如,若基礎資料表使用 customerId 作為分割區索引鍵 (平均分佈),而 GSI 使用 status 作為分割區索引鍵 (可能值有限,如 "active"、"pending"、"closed"),則即使基礎資料表存取均衡,針對熱門狀態值項目的更新仍可能造成 GSI 熱分割區。這種情況特別具挑戰性,因為即使基礎資料表與 GSI 均具足夠整體容量,且基礎資料表存取模式分佈良好,應用程式仍可能因 GSI 熱分割區而遭遇限流。

即使限流例外狀況指向 GSI (透過 ResourceArn),實際受到限流的操作仍是對基礎資料表的寫入。這可能令人困惑,因為應用程式實際寫入的是基礎資料表,卻收到與 GSI 有關的例外狀況。

GSI 限流類型

GSI 背壓限流會依具體容量限制,呈現不同類型的例外狀況:

  • 超過 GSI 佈建容量:當 GSI 沒有足夠的寫入容量單位來處理基礎資料表的更新作業時發生。這會產生包含原因 IndexWriteProvisionedThroughputExceededProvisionedThroughputExceededException,並直接 ResourceArn 指向發生容量限制的特定 GSI。

  • GSI 隨需輸送量上限超出限制:當 GSI 的寫入作業超過為隨需資料表設定的最大輸送量限制時發生。這會產生包含原因 IndexWriteMaxOnDemandThroughputExceededThrottlingException,用以識別具設定輸送量限制的特定 GSI。

  • 超過 GSI 分割區限制:即使整體 GSI 容量看似充足,若個別 GSI 分割區的輸送量超出上限 (熱分割區),仍會發生此情況。這會產生包含原因 IndexWriteKeyRangeThroughputExceededThrottlingException,指出於 ResourceArn 中識別的特定 GSI 出現熱分割區問題。這點尤其重要,因為 GSI 的分割區分佈可能與基礎資料表顯著不同,即使基礎資料表的存取均勻分佈,仍可能在 GSI 中產生熱點。

  • GSI 帳戶上限超出限制:當特定 GSI 的寫入作業超過帳戶層級設定的每個資料表 (或該資料表內任何個別 GSI) 區域輸送量上限時觸發。DynamoDB 會傳回包含原因 IndexWriteAccountLimitExceededThrottlingException,指出用量超出帳戶限制的特定 GSI。此限流會針對每個超出限制的 GSI 獨立發生。如需各資料表、各帳戶、區域及服務配額的詳細資訊,請參閱 Amazon DynamoDB 中的配額