2011-10-17 8 views
1

私は、さまざまなプロセスによって定期的に更新される行を持つAzureテーブルストレージにテーブルを持っています。特定の期間内に行に更新されていないときを効率的に監視し、発生した場合にアラートが生成されるようにしたいと考えています。Azureでの非アクティブ化のための戦略

ほとんどのタスクスケジューラの実装私は、一度に1人のワーカーしか特定のジョブを実行しないようにすることで、Azureの機能について見てきました。ただし、n分を待ってスケジュールされたタスクを設定し、最新のタイムスタンプを照会してアクションを取るべきかどうかを判断すると、作業がワーカに広がらないため、非効率的です。また、非常に多くのレコードをポーリングする必要があるのは、一般的に非効率なようです。

この例を使用すると、過去30日間にWebサイトにログインしていないユーザーに電子メールを送信することができます。効率的なアルゴリズムを生成する目的で、ユーザの数が「多数」であると仮定する。

最近のアクティビティをチェックするために使用できる戦略については、1人の従業員に強制しないでください。

答えて

3

タイムスタンプが行キー(DateTime.UtcNow.Ticks.ToString("d19"))であるLastActiveテーブルを保持します。古い行を削除して新しい行を挿入するバッチ・トランザクションを実行して更新します。

ここで、非アクティブユーザーのクエリは、from user in LastActive where user.PartitionKey == string.Empty && user.RowKey < (DateTime.UtcNow - TimeSpan.FromDays(30)).Ticks.ToString("d19") select userのようなものです。これはどんなサイズのテーブルでも非常に効率的です。

その情報をどのように処理するかによって、メッセージをキューに入れてから行を削除することができます(次回の確認時に気付かない場合があります)。複数のワーカーがキューメッセージを取得してアクションを実行できるようになりました。

複数のワーカーインスタンスでこれを行うことを希望しているとは混乱しています...おそらく、非アクティブなユーザーに対しては一度しか行動しないようにしたいので、1つのインスタンスでチェックしてください。 (電子メールやその他の作業を送信する作業は、キューを使用して広めることができますが、最初のチェックはちょうど1つのインスタンスで行う必要があります)。

+0

私は単純な例としてユーザーを使用しました。私のデータは実際には各行に対して5秒に1回更新されています。追加のテーブルを更新すると、数千行のテーブルスキャンだけでなく、大幅にオーバーヘッドが発生します。通常は、1人の作業者の過度の負荷を避けるために、実際の作業をキューに入れることができます。しかし、キューが500メッセージ/秒に制限されているとすれば、5000行は待ち行列に入るのに50秒かかります。私は何とか直接処理することを望んでいました。 –

+0

もっと重要なのは、これらの行をすべて同じPKに入れることで、私は500にすることができる更新/秒の数を制限することになります。私は何千もの規模に拡大したいと思います。 –

+0

スキャンが速ければ、私はあなたが何を求めているのか分かりません。スキャンを実行します。 1つのパーティションのスケーラビリティが十分でない場合は、複数のパーティションを使用します。 1つのキューのスケーラビリティが十分でない場合は、複数のキューを使用します。ストレージアカウント全体に制限がある場合は、複数のストレージアカウントを使用することもできますし、異なるストレージテクノロジを検討することもできます。 – smarx

関連する問題