2017-06-28 11 views
1

これがこの問題を解決する最善の方法であるかどうかを確認するだけです。低分布のDynamoDBインデックスのクエリ

シナリオ

我々は、オンラインスポーツマネージャーのゲームを構築しています。試合にはチームがあり、チームは「フィクスチャ」と呼ばれるものでお互いにプレイします。

各シーズンの開始時に、シーズン用のフィクスチャが作成され、テーブルに登録されます。フィクスチャアイテムは、チーム1対チーム2、12月1日午後7時を指定することができます。

チームのオーナーがその時点までに行った変更を考慮に入れて、各フィクスチャのゲームプレイがフィクスチャの開始時刻に作成されます。

私たちは、1)実行していない、2)開始日が<=のフィクスチャをテーブルでチェックする必要があるスケジューラを持っています。システムの問題やダウンタイムが発生した場合でも、実行待ちの可能性のある一致を追い抜くことができるように、「より小さい」が含まれています。

問題

どのように我々はまだ実行していない備品のための大規模なDynamoDBのテーブルを検索し、その開始日になりましたか早いん。

現在のソリューション

現在の計画では、Dateフィールドと一緒に、最初はtrueに設定HasNotRunと呼ばれるブール型フィールドを作成することです。次に、HasNotRunフィールドをパーティションキーとして使用して、すべてのフィクスチャをまだ実行しないようにし、Dateをソートされた範囲キーとして使用し、それをフィルタリングするスパースなグローバルセカンダリインデックスを作成します。一致が実行されると、HasNotRunフィールドがアイテムから削除され、アイテムがスパースインデックスから削除されます。

フィールドは常にtrueの単一の値になるため、このインデックスのすべての項目は常にDynamoDBを使用する最良の方法のようには見えない単一のパーティションになります。

良い方法はありますか?

この問題を解決するには、より良い方法がある場合は、それを聞いてみたいです。私たちはそれがそこにあることを知っている!

答えて

0

あなたのソリューションは実際にはかなり良いです。単一のキーを持つことは、すべてのスループットが単一のキーに移動するため、実際にはそれほど悪くはありません。不均一なクエリ配布を持つ複数のキーがあった場合、問題が発生します。ただ1つのキーで、あなたはその問題を起こすことはありません。ただし、非常に高いスループットが期待される場合は、さまざまなタイプの問題を引き起こす可能性があります。このGSIのアイテムの合計数が10GB未満の場合、単一パーティションのスループット制限(3000RCUと1000WCUと思われます)によって制限されます。 10GBを超えると、2番目のパーティションが作成され、最大スループットはそれぞれ6000/2000に制限されます。

ソリューションを改善する方法の1つは、ブール値の代わりにシャードを使用することです。 「true」の値を割り当てる代わりに、1からNまでの乱数を割り当てます(Nはスケーリング計画に依存し、動的に調整することもできます)。クエリでは、各キーに対してN個のクエリを実行する必要があります(パラレルで実行できます)。その後、結果をマージします。このソリューションは、最初の段落で説明した問題を抱えません。