質問

現在、Azure Table Storage 用のアプリケーションを開発しています。そのアプリケーションには、挿入が比較的少ないテーブル (1 日あたり数千件) があり、これらのエンティティの主キーは、数十億行を持つ別のテーブルで使用されます。

したがって、GUIDの代わりに自動インクリメントされる整数を小さなテーブルの主キーとして使用する方法を探しています(多くのストレージが節約され、挿入のスケーラビリティは実際には問題ではないため)。

このトピックについてはいくつかの議論がありました。の上 http://social.msdn.microsoft.com/Forums/en/windowsazure/thread/6b7d1ece-301b-44f1-85ab-eeb274349797.

ただし、同時実行の問題はデバッグしたり特定したりするのが非常に難しいため、これを独自に実装することに少し抵抗があります。したがって、私の質問は、これについて十分にテストされた実装があるかどうかです。

役に立ちましたか?

解決

まだ実装していませんが、鋭意取り組んでいます...

次に使用する ID をキューにシードし、必要なときにキューから ID を選択することができます。

キューに追加された最大の数値を含むテーブルを保持する必要があります。大量の整数を使用しないことがわかっている場合は、ワーカーを頻繁に起動させて、キューに整数がまだ残っているかどうかを確認することができます。また、ワーカーが使用状況を監視するためにチェックできる、使用済みの int キューを用意することもできます。

また、そのワーカーを接続して、コードで ID が必要になったときにキューが空だった場合 (偶然) にワーカーの昼寝を中断して、できるだけ早くさらにキーを作成できるようにすることもできます。

その呼び出しが失敗した場合は、次の方法が必要になります (作業者に自分が作業 (ロック) を行うつもりであることを伝え、作業者に次の ID を取得してロックを解除する作業を行わせる)

  1. ロック
  2. テーブルから作成された最後のキーを取得します
  3. 増分して保存する
  4. ロックを解除する

新しい値を使用します。

他のヒント

検索でそれを見つけるだろう誰のために、よりよい解決策があります。 テーブルロックのための最小限の時間があります15秒に - それはひどいです。あなたが本当にスケーラブルなソリューションを作成したい場合は、それを使用しないでください。 Etagを使用してください!

(あなたも、IDまたは何としてそれに名前を付けることができます)ID用テーブル内の1つのエンティティを作成します。

1)、それを読んでます。

2)インクリメント

3)InsertOrUpdateの()で読み出しクエリから指定されたETag

最後の操作(InsertOrUpdate)が成功した場合、あなたは新しい、ユニークな、自動インクリメントのIDを持っています。それは(HttpStatusCodeの== 412で例外を)失敗した場合、それはいくつかの他のクライアントがそれを変更することを意味します。だから、再び1,2および3を繰り返します。 Read+InsertOrUpdateための通常の時間には、のを200ミリ秒未満です。 githubのの上のソースと私のテストユーティリティます。

IDの重複を防ぎ、IDを自動インクリメントできるようにする解決策は、次のとおりです。

  1. BLOB をロック (リース) そしてそれを論理ゲートとして機能させます。

  2. 次に、値を読み取ります。

  3. インクリメントした値を書き込む

  4. リースを解除する

  5. アプリ/テーブルの値を使用します

そのプロセス中に Worker ロールがクラッシュしたとしても、ストア内で ID が失われるだけになります。私の意見では、重複よりも優れています。

がここにあります コードサンプルと詳細情報 Steve Marx のこのアプローチについて

あなたが本当にGUIDを避けるために必要がある場合は、日付/時刻に基づいて何かを使用して検討し、その後、並行性のリスクを最小限に抑えるためにパーティション・キーを活用しています。

あなたのパーティション・キーは、同時実行を制御するために十分に小さいタイムスパンで日時の残りの可能性があり、ユーザ、年、月、日、時間、などと行キーである可能性があります。

もちろん、あなたがGUIDを回避することが(うまく動作しますGUIDを仮定して)この余分な努力のすべては本当に価値がある場合は、アズールの日付の価格で、自問する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top