2012-03-27 13 views
3

Azureテーブルを使用して、さまざまなアプリケーション関連のカウンタを格納する予定です。私の懸念は、カウンターはアプリケーションの多くの異なるクライアントインスタンスから増やされるということです。Azureテーブルでカウンタをインクリメントする

表面上の単純な作業のようですが、それをもっと近く見るとかなり難しいです。

私は誰かが問題をより管理しやすくするのに役立つだろうと思っています。

ありがとうございます!

+1

カウンターの目的についてもっと詳しく教えてください。 – Aymeric

+0

http://stackoverflow.com/a/11853335/67824 –

答えて

0

カウンタの数と更新の頻度によっては、Azureテーブルストレージが最適な方法ではない場合があります。テーブルストレージは、ロックやトランザクションのサポート、または最初に取得することなくサーバー上の値を更新する機能を備えていません。したがって、同じ行を更新しようとしている間に別のインスタンスが行を更新したため、更新が失敗する状況が発生する可能性があります。

更新の頻度と頻度が頻繁に更新を再試行すると、サーバー側で更新をアトミックにする代わりにSQL Azureを検討することをお勧めします。 (UPDATE Abc SET Value = Value + 1 WHERE ...のようなものです)。

3

スティーブ・マルクスはこれを彼のblogと関連するCloud Cover episodeでかなりうまくカバーしています。短いバージョンは:

  • クライアントはWebロールにアクセスします。
  • Webロールは、System.Threading.Interlocked機能を使用して静的変数を更新します。これにより、サーバー上の同じ番号を更新しようとする複数のスレッドが回避されます。
  • 各Webロールにはバックグラウンドスレッドがあり、バックグラウンドスレッドは、タイムテーブルでPartitionKey/RowKeyの一部としてインスタンス名を含むカウントテーブルに書き戻します。これにより、同じ番号を同時に更新しようとする2つのインスタンスが回避されます。
+0

これは複数のウェブの役割に対応しますか? – Chandermani

+0

はい、各ロールの各インスタンスは一意の名前を持つため、基になるテーブルには独自の行が存在するためです。 – knightpfhor

3

代わりに、ヒットごとに1つの行を保存しないでください。カウンター値を知るためにデータを集計する。

ハイブリッドアプローチでは、照合ヒットを維持します。集約を実行して保存します。古いヒットデータをクリアして削除します。

3

Redisキャッシュの導入Redisは、このタスクに使用することができます。また、Redisにはアトミックインクリメント(http://redis.io/commands/INCR)があります。