使用寫入碎片以平均分佈工作負載 - Amazon DynamoDB

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

使用寫入碎片以平均分佈工作負載

在 Amazon DynamoDB 中的分割區索引鍵空間分配寫入的一個好方法是拓展空間。您可以數種不同的方式來執行此動作:您可以在分割區索引鍵值中新增隨機數字,以便在分割區之間分配項目。或者,您可以使用根據您查詢內容計算的數字。

使用隨機尾碼的碎片

要在分割區索引鍵空間中更平均地分佈負載的方法,即是在分割區索引鍵值的結尾新增一個亂數。如此您就能在較大的空間中將寫入隨機化。

例如,對於代表今天日期的分割區索引鍵,您可以選擇 1200 間的一個亂數,並將其串連到日期做為尾碼。這會產生分割區索引鍵值,例如 2014-07-09.12014-07-09.2... 到 2014-07-09.200。因為您隨機化了分割區索引鍵,每天對資料表的寫入會平均分配在多個分割區中。這可帶來更優良的平行處理與更高的整體傳輸量。

然而,若要讀取指定日期的所有項目,您需要查詢所有尾碼的項目,接著合併結果。例如,您會先對分割區索引鍵值 2014-07-09.1 發出 Query 請求。再對 2014-07-09.2 發出另一個 Query,依此類推直到 2014-07-09.200。最後,您的應用程式需要合併所有該等 Query 請求的結果。

使用計算尾碼的碎片

隨機化的策略可大幅改善寫入傳輸量。由於您不知道寫入項目時所使用的尾碼值,因此很難讀取特定項目。若要讓讀取個別項目變得比較容易,您可以使用不同的策略。不使用亂數以在分割區中分佈項目,而是使用您可以計算的數字 (根據您想要查詢之項目)。

考量先前的範例,其中資料表會使用分割區索引鍵中的今天日期。現在假設每個項目有可存取的 OrderId 屬性,且您經常需要依訂單 ID (除了日期) 來尋找項目。在您的應用程式將項目寫入資料表之前,可根據訂單 ID 計算雜湊尾碼並將其附加至分割區索引鍵日期。計算應會產生介於 1 到 200 之間的數字,此分佈非常平均,與隨機策略產生的結果相當類似。

簡單的計算可能就足夠了,例如訂單 ID 中字符的 UTF -8 碼點值的乘積,模數 200,+ 1。分割區索引鍵值會是與計算結果串聯的日期。

有了這項策略,即可在分割區索引鍵值之間,以及實體分割區之間平均分配寫入。您可以輕鬆地對特定項目與日期執行 GetItem 操作,因為您可以計算對特定 OrderId 值的分割區索引鍵值。

若要讀取指定日期的所有項目,您仍然需要 Query 每個 2014-07-09.N 索引鍵 (其中 N 是 1-200),而且您的應用程式需要合併所有結果。好處是您能避免讓單一「經常性」分割區索引鍵值承受所有工作負載。

注意

如需為了處理大量時間序列資料而設計的有效策略,請參閱 時間序列資料