2012-03-28 12 views
4

私の同僚と私はcurrenty製品のアンドゥ/リドゥ機能を実装しています。私たちは、コマンドパターンを使用して、すべてのコマンドを保存している(例えば、コンポーネントを作成する「myFancyComponent」)TableStorageEntryとして表に「ProductHistory」。この表のPartitionKeyRowKeyは一意の識別子であり、ユニークな製品名です。削除Azureテーブルストレージからのエンティティの数百

問題は、製品が削除される場合、それはまた、テーブルのストレージに歴史全体を削除する必要があります。バッチ削除を使用すると、いくつかの制限があるため、かなり複雑になる可能性があります。 100エンティティまたは最大4 MB(これより小さいものであれ)。この問題のベストプラクティスはありますか?または、すべてのエントリを照会し、エントリのサイズを確認し、エントリの正しい量をバッチ削除する唯一のソリューションですか?

また、私はこの似questionを発見し、各製品用のテーブルを作成するために検討しました。このアプローチのいくつかの利点があるようです:一つだけのテーブルが

  • の削除は簡単ですが照会されますので、

    • の選択は、より高速である必要があり、ちょうどのみ全体テーブルに

    をドロップする必要があります欠点私は(「WINDOWSアズール表」に - ホワイトペーパー)実測値:テーブルが削除されるときにテーブルがあるが、同一のテーブル名が、少なくとも30秒間、再作成することができない、ということ

    • 注ガベージコレクション。私は数百のテーブルを作成する場合

  • は、他の(パフォーマンス)の問題がありますか?

    答えて

    8

    私は、削除のためにトランザクションをバッチアップする必要がなくなり、30秒の制限を削除する必要があることを指摘したので、製品ごとに1つのテーブルを使用することを強くお勧めします。インデックステーブルとその製品間の関係を格納するテーブル。次に、製品を削除済みとしてフラグを立て、再追加したときにそのテーブルを再割り当てすることができます。したがって、30秒の制限の単純なバイパスを可能にする。もう1つのアプローチ(私もお勧めします)は、非同期的に起こるように製品の追加を切り離すことで、名前が再び利用可能になったときにテーブルを作成するのを待つことができます。

    Azureストレージアカウントの現在の5kトランザクション/秒の制限を超えないことを条件として、何千ものテーブルを持っていてもパフォーマンスの問題はありません。 :)

    +0

    30秒制限を解決するために2番目のアプローチを詳しく説明できますか?製品を作成することをお勧めしますが、テーブルは作成しないでください。古いものが削除された後にテーブルを作成しますか? – Robar

    +0

    規模を達成するには、「リアルタイムで」操作をやめることが重要です。新製品の作成依頼をキューに入れ、完了したらメッセージを送信します。はい、私たちは即時満足に慣れていますが、この方法はスケーラビリティが高く、30秒の待ち時間にも対応します。 :) – BrentDaCodeMonkey

    関連する問題