2017-06-28 29 views
1

只是想看看這是否是解決此問題的最佳方法。查詢低分佈的DynamoDB索引

方案

我們正在建立一個在線體育經理遊戲。在我們的比賽中有一些球隊,球隊將在我們所說的「夾具」中相互扮演。

在每個賽季開始時,創建本賽季的裝置並輸入到表格中,例如,夾具項目可能在12月1日晚上7點指定隊1與隊2。

每個燈具的遊戲玩法都是在燈具開始時創建的,以考慮隊員可能在此之前所做的更改。

我們有一個調度程序,它需要檢查表的固定裝置:1)沒有運行,2)現在開始日期爲<=。我們包括「少於」,這樣如果系統問題或停機時間,我們可以趕上任何可能仍在等待運行的比賽。

問題

我們如何尋找一個大dynamodb表尚未運行的固定裝置,並且其開始日期是現在或更早。

目前的解決方案

目前的計劃是創建一個名爲HasNotRun初始設置爲true一個布爾領域,隨着Date場一起。然後,我們使用HasNotRun字段作爲分區鍵創建一個稀疏的全局二級索引,以使所有的燈具尚未運行,並使用Date作爲排序的範圍鍵,並對其進行過濾。一旦匹配運行,HasNotRun字段將從該項目中刪除,因此該項目將從稀疏索引中刪除。

但是,由於HasNotRun字段始終爲單個值true,因此此索引中的所有項都始終位於單個分區中,這似乎不是使用DynamoDB的最佳方式。

更好的方法?

如果有更好的方法來解決這個問題,我們很樂意聽到它。我們知道它在那裏!

回答

0

您的解決方案實際上相當不錯。擁有一個單一的密鑰實際上並不像聽起來那麼糟糕,因爲所有的吞吐量都會被傳送到那個單一的密鑰。如果您擁有多個具有非統一查詢分佈的密鑰,則會出現問題。只有一個關鍵你不會有這個問題。但是,如果您希望獲得非常高的吞吐量,則可能會導致不同類型的問題:如果此GSI中的項目總數低於10GB,那麼您將受到單分區吞吐量限制(我認爲爲3000RCU和1000WCU)的限制。如果超過10GB,則會創建第二個分區,最大吞吐量將分別限制爲6000/2000,等等。

您可以改進您的解決方案的一種方法是使用碎片而不是布爾值。而不是分配「真」的值,分配一個從1到N的隨機數(N取決於您的縮放計劃,也可以動態調整)。您現在需要爲每個鍵執行N個查詢(可以並行執行),然後合併結果。此解決方案不會遇到第一段中提到的問題。