0

Amazon DynamoDB の上にオブジェクトのスケーラブルな順序付けされていないコレクションを実装することを検討しています。これまでのところ、次のオプションが検討されています。

  1. DynamoDB ドキュメント データ型 (マップ、リスト) を使用し、ドキュメント パスを使用してスタンドアロン アイテムにアクセスします。これには、コレクションが 400KB のデータに制限されるという明らかな欠点が 1 つあります。つまり、サイズにもよりますが、おそらく 1..10K オブジェクトです。あまり目立たない欠点は、そのようなコレクションに新しいオブジェクトを挿入するコストが膨大になることです。Amazon は、新しく追加されたオブジェクトだけでなく、アイテムの合計サイズに基づいて書き込み容量が差し引かれることを指定しています。サイズ制限に近づくと 1KB オブジェクトを挿入します。それで、これが除外されたと考えると?

  2. 複合プライマリ ハッシュ + 範囲キーを使用します。ここで、プライマリ ハッシュはコレクション内のすべてのオブジェクトで同じままであり、範囲キーは単なるランダムまたはアトミック カウンターです。明らかな欠点は、同一のハッシュ キーを使用すると、キーの配布がうまくいかないことです。多数のオブジェクトを含むコレクションがある場合、カーディナリティが低くなります。これは、不適切なパーティショニングを意味し、同じコレクションのすべての読み取り/書き込みが 1 つのシャードにスタックされるというスケールの問題が発生し、DynamoDB パーティションの 1 秒あたり 3000 回の読み取り / 1000 回の書き込みの制限を受けることになります。

  3. セカンダリ ハッシュ + レンジ キーでグローバル セカンダリ インデックスを使用します。ハッシュ キーは同じコレクションに属するすべてのオブジェクトで同じままであり、レンジ キーはランダムまたはアトミック カウンターです。上記と同様に、パーティショニングは GSI にとって不適切になり、同一のハッシュが多すぎるとボトルネックになり、プロビジョニングされたすべての容量がインデックスに急速に排出されます。GSI が正確にどのように実装されているかわかりませんでした。

問題は、私が (2) または (3) と一緒に暮らすことができ、理想的ではないキー配布に苦しむことができるかどうか、または見過ごされていたコレクションを実装する別の方法があるかどうか、またはおそらく別の nosql データベースエンジンを検討することを検討する必要があるかどうかです。

4

1 に答える 1

0

これは「腰からの射撃」の答えです。最終的に何をするかは、読み書きの量と種類によって異なります。

dynamo のドキュメントで避けるように勧められている 2 つのことは、ホット キーと、一般的にはスキャンです。(2) と (3) の場合は、ホット キーになると指摘しました。これが拡張されると予想される場合 (大規模なコレクション)、特にこれが書き込み集中型のアプリケーションである場合、ホット キーはおそらくますますダメージを与えるでしょう。

クエリおよびスキャン操作に関するドキュメント ( http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html ) では、クエリの場合、「ハッシュ キー属性の名前と値を平等条件。」そのため、スキャンを回避したい場合でも、ハンドが強制され、ホット キーの状況に戻る可能性があります。

1 つの方法は、スキャン操作の実行を受け入れることかもしれませんが、コレクション専用のテーブルを 1 つだけ用意してください。次に、完全にランダムな (十分に分散された) ハッシュ キーを取得し、毎回スキャンを実行できます。これは、常にコレクションのすべてが必要であると想定しています (あなたは言いませんでした)。大規模なコレクションにスケールアップする場合、これは依然として問題になりますが、常に完全なセットを元に戻したい場合は、関係なくその問題に対処する必要があります. サブセットだけが必要な場合は、制限パラメーターを追加できます。これはパフォーマンスに役立ちますが、常に同じサブセットが返されます (または、最後に評価されたキーを使用して続行できます)。ドキュメントには、並列スキャンについても言及されています。

AWS を使用している場合、elasticache/redis を試してみてください。最初のパスは、あなたが言及した状況(1)よりもはるかに高速/クリーンにコード化される可能性があります。

于 2015-09-21T18:50:03.820 に答える