2

スマートフォン クライアントにサービスを提供するために、Web ロールで wcf を作成したいと考えています。

さらに、各メンバーを反復処理する無限のバックグラウンド タスクを作成し、必要に応じてメンバーにプッシュ通知を送信する必要があります (決定は、各メンバーの Facebook クエリに基づいて行われます)。

今のところ、アプリケーションは新しく、私はクライアントを持っていないので、複数の VM は必要ありません (コスト削減のため..)。それ。私が持っている唯一の要件は、すべてのメンバーの反復が 30 分未満の間隔で完了することです。

私は2つの解決策について考えていました:

1. 1 つの VM でのみ実行される従来の Windows サービスを実行するには (スケールアウトしても、この Windows サービスの 1 つのインスタンスはそのうちの 1 つのみで実行されます)。さらに、wcf サービスに "void Handle(Member member) メソッドを追加します。Windows サービスには、wcf リクエストをこのメソッドに送信する無限ループがあります。このように、インスタンスをスケールアウトすると、負荷分散によって負荷が分散されます。仕事。

問題: Windows サービスは、wcf サービスに送信できる同時要求の数を認識していません。1 つの Facebook クエリが完了するのを待っている間に、他のメンバーにさらに Facebook リクエストを送信できるため (もちろん、サーバーが並行して処理できる制限まで)、メンバーの同時処理が本当に必要です (処理には数秒かかります)。私はFacebookのバッチリクエストを使用しているため、応答する各Facebookクエリ)。

2. 各 webrole インスタンスは、さまざまなメンバーの処理を担当します (バックグラウンド作業についてのみ話しています)。たとえば、2 つのインスタンスがある場合 (1 回スケールアウトしたため)、最初のインスタンスは ID % 2 == 0 のメンバーを担当し、2 番目のインスタンスは ID % 2 == 1 を担当します。各インスタンスの起動時に、現在のインスタンスをSQLテーブルに登録すると考えています。

さらに、各 Web ロール インスタンスには、次のようなバックグラウンド スレッドがあります。

  1. どのメンバーが彼の責任であるかを知るためにSQLテーブルをチェックしてください
  2. それらのメンバーを処理する
  3. LastHandleTime の日付を設定する
  4. 5 分間 LastHandleTime を更新しなかったインスタンスのレコードがある場合は、そのレコードを削除することを確認します (他の誰かが次回そのメンバーを取得するようにします)。

編集:このソリューションにも問題があります。wcf サービスの全期間にわたってバックグラウンド スレッドを実行し続けることはできません。サービスにアクティビティがない場合、IIS によってスレッドが強制終了される可能性があります [詳細: http://forums.asp.net/t/1830688.aspx/ 1]

Edit2:それを解決するには、バックグラウンド スレッドを別の Windows サービスとして実行します。将来、必要に応じて、簡単にワーカー ロールに変換できます。Web ロールと Windows サービスは、最初から応答があり、2 番目からプッシュ通知 (必要な場合) があることを除いて、同じ処理ロジックを使用するため、両方の処理ロジックで共有 dll を使用します。 .

どちらのソリューションが優れていますか? 提示された問題をどのように解決しますか?

4

1 に答える 1