本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
了解 DynamoDB 中的全域次要索引 (GSI) 寫入限流和背壓
GSI 背壓限流代表 DynamoDB 中最複雜的限流案例之一,因為它會在寫入操作與限流之間建立間接關係,您的應用程式會寫入基底資料表,但由於一或多個索引的容量限制而遇到限流。
了解 GSI 背壓限流
當您寫入 DynamoDB 資料表時,該資料表上的任何全域次要索引 (GSIs) 都會使用最終一致模型以非同步方式更新。如果 GSI 沒有足夠的容量來處理這些更新,DynamoDB 調節會寫入基底資料表以維持資料一致性。這稱為 GSI 背壓。如需 GSIs如何運作的詳細資訊,請參閱 DynamoDB 中的全域次要索引。
與正在存取資源的直接資料表調節不同,GSI 背壓也會在基礎資料表及其索引之間建立相依性。即使您的基底資料表具有足夠的容量,如果任何相關聯的 GSI 無法處理更新磁碟區,寫入也會受到調節。此關係對於了解尤其重要,因為分割區層級限制會獨立套用至基底資料表和每個 GSI,每個都有自己的分割區結構和對應的輸送量限制。
GSI 分割是以 GSI 的分割區索引鍵為基礎,這通常與基底資料表的分割區索引鍵不同。即使您的基本資料表存取在分割區之間完美分佈,您的 GSI 更新仍可能專注於特定分割區,在 GSI 中建立熱點。如需資料表和 GSIs 分割區索引鍵設計的一般最佳實務,請參閱 DynamoDB 分割區索引鍵設計。
例如,如果您的基礎資料表使用 customerId
做為分割區索引鍵 (平均分佈),但您的 GSI 使用 status
做為分割區索引鍵 (可能值有限,例如「作用中」、「待定中」、「關閉」),則即使基礎資料表存取平衡,具有熱門狀態值的項目更新也可以建立 GSI 熱分割區。這會產生一個特別具挑戰性的案例,您的應用程式可能會因為 GSI 熱分割區而遇到限流,即使基礎資料表和 GSI 都有足夠的整體容量,而且基礎資料表的存取模式似乎分佈良好。
即使限流例外狀況指向 GSI (透過 ResourceArn
),正在限流的實際操作是對基底資料表的寫入。這可能會令人混淆,因為您的應用程式正在寫入基底資料表,但收到有關 GSI 的例外狀況。
GSI 限流的類型
根據特定容量限制,透過不同例外狀況類型的 GSI 背壓限流資訊清單:
-
超過 GSI 佈建容量:當 GSI 缺少足夠的寫入容量單位來處理來自基礎資料表操作的更新時發生。這會產生
ProvisionedThroughputExceededException
具有原因 的 IndexWriteProvisionedThroughputExceeded,並直接ResourceArn
指向遇到容量限制的特定 GSI。 -
超過 GSI 隨需輸送量上限:當 GSI 寫入操作超過對隨需資料表設定的最大限制時發生。這會產生
ThrottlingException
具有原因 的 IndexWriteMaxOnDemandThroughputExceeded,識別具有已設定輸送量限制的特定 GSI。 -
超過 GSI 分割區限制:即使整體 GSI 容量看起來足夠,個別 GSI 分割區超過其輸送量限制 (熱分割區) 就會發生。這會產生
ThrottlingException
具有原因 的 IndexWriteKeyRangeThroughputExceeded,表示 中識別的特定 GSI 出現熱分割區問題ResourceArn
。這尤其重要,因為 GSI 分割區分佈可能與基底資料表的分割區分佈明顯不同,即使基底資料表存取均勻分佈,也會在 GSI 中建立熱點。 -
超過 GSI 帳戶限制:當對特定 GSI 的寫入操作超過帳戶層級設定的每資料表 (或該資料表內的任何個別 GSI) 區域輸送量界限時觸發。DynamoDB 傳回
ThrottlingException
具有原因 的 IndexWriteAccountLimitExceeded,指向推送其用量超過帳戶限制的 GSI。此限流會針對超過限制的每個 GSI 獨立發生。如需每個資料表、每個帳戶、區域、服務配額的相關資訊,請參閱 Amazon DynamoDB 中的配額。