16

現在、Azureテーブルストレージ用のアプリケーションを開発中です。このアプリケーションでは、比較的少数のインサート(数千/日)を持つテーブルがあり、これらのエンティティの主キーは数十億の行を持つ別のテーブルで使用されます。Azureテーブルストレージの自動インクリメント

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

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

しかし、並行性の問題は本当にデバッグして見つけるのが難しいかもしれないので、これを独自に実装するのは少し不快です。したがって、私の質問は、これがうまくテストされているかどうかです。あなたがそれらを必要とするときにだけキューをそれらを狙い撃ち、使用するためにあなたの次のIDでキューをシードでき

私はまだこれを実装していないが、それに取り組んでいます

+0

あなたが本当に心配している場合は、SQL AzureでID値を生成するテーブルを用意してください。 – Andrew

+0

これはかなり良い提案です。 Azure SQL Data Servicesはアイデンティティ列をサポートしていないため、SQL Serverをセットアップする必要があります。http://www.shanmcarthur.net/cloud-services/design-strategies-for-Azure-and-SDS 。 – Yrlec

答えて

4

...。

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

あなたは、コードがid(偶然)を必要とするときにキューが空の場合、より多くのキーをできるだけ早く作成するためにワーカーの昼寝を妨害する可能性があります。

その呼び出しは、あなたが(次のIDとロック解除を得るための労働者の作業を行う、その後、(ロック)あなたが彼らのために仕事をしようとしている労働者に伝える)

  1. への道が必要となり失敗した場合テーブルから
  2. 増分を作成した最後のキーを取得し、新しい値を使用し、その後
  3. ロック解除

を保存

  • をロックします。

  • +1

    しかし、重複するIDが作成されないことをキューがどのように保証していますか?私が理解できることは、http://download.microsoft.com/download/5/2/D/52D36345-BB08-4518-A024-0AA24D47BD12/Windows%20Azure%20Queue%20-%20Dec%202008.docxです。キューメッセージの処理中にワーカープロセスが失敗した場合、メッセージは再びキューに追加されます。したがって、作業員の役割を偶発的にする必要があります。同じメッセージ(つまり同じID)が2つの異なるワーカー・ロールによって使用されている場合、私はあなたがその冪等をいかにして作ることができるかわかりません。 – Yrlec

    +2

    あなたが1人のwokerしか作成していない場合は、idを作成すると、dupsがキューに入れられます。 メッセージを取得してから、メッセージの内容(ID)を使用する前にメッセージを削除してください。これにより、IDが複数回使用されないようにする必要があります。悪いケースのシナリオのように見えるかもしれませんが、あなたは鍵を失うかもしれませんが、あなたの一意性は依然として良好でなければなりません。 –

    +0

    上記の2番目の文は次のようにする必要があります。「IDを作成するウォーカー1人しかいない場合、dupsはキューに入れられません...」 –

    3

    あなたが実際にguidを避ける必要がある場合は、日付/時刻に基づいて何かを使用し、パーティションキーを利用して並行性のリスクを最小限に抑えることを検討しましたか?

    パーティションキーは、ユーザー、年、月、日、時などで指定できます。並行性を制御するのに十分な時間幅で行キーを残りの日時にすることができます。

    もちろん、Guidがこの余分な努力の価値があることを避けるのであれば、Azureの日付の代価で自分自身に質問しなければなりません。

    4

    私はそれが重複したIDを防ぎ、あなたはそれが

    1. lock (lease) a blobと論理ゲートとして作用するようにすることです自動インクリメントできたソリューション。

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

    3. は、あなたの労働者の役割は、その後、そのプロセス中にクラッシュした場合、リース

    4. は、その後、あなたのアプリ/テーブルに

    を値を使用してインクリメントされた値

  • リリースを書きますあなたの店にはIDがないだけです。 IMHOは複製よりも優れています。ここで

    が検索でそれを見つけるだろう誰のためにスティーブ・マルクス

  • 10

    から、このアプローチにcode sample and more informationで、よりよい解決策があります。 Minimal time for table lock is 15 seconds - それはひどいです。本当にスケーラブルなソリューションを作成する場合は、使用しないでください。 Etagを使用してください。

    IDのテーブルに1つのエンティティを作成します(IDなどの名前を付けることもできます)。

    1)読んでください。

    2)増分。

    3)InsertOrUpdate ETagが指定されています(読み取りクエリから)。

    最後の操作(InsertOrUpdate)が成功すると、新しい一意の自動インクリメントIDが作成されます。失敗した場合(HttpStatusCode == 412の例外)、それは他のクライアントが変更したことを意味します。したがって、1,2,3を再度繰り返してください。通常の時間はRead+InsertOrUpdateです。200ms未満です。私のテストユーティリティwith source on github

    +0

    優れたアイデア。 – PilotBob

    +0

    EGTを使用して原子操作、読み取り、および増分を保証するのはどうですか? これは実行可能な方法ですか? https://docs.microsoft.com/en-gb/azure/storage/storage-table-design-guide#entity-group-transactions –

    関連する問題