2012-03-13 15 views
2

私は、Windowsサービス内で動作するクラスライブラリを持っています。このライブラリには、電子メール(タスクに分解される可能性がある)をポーリングしたり、メッセージなどを処理したりするための長い実行スレッドがあり、うまく機能します。分散ウィンドウサービス

これは、ノードを追加することによってスケールアウトする必要のある製品の一部です。私は現在、単一のノードによって処理される顧客を定義しています。

私の問題は、そのノードがダウンした、またはメンテナンスを必要とする場合、手動での介入が必要とされ、データがダウンタイム中に失われています。私はそれが負荷分散されたWebサーバーのように動作するようにするソリューションを考え出したいと思います。ノードが停止すると、アプリケーションはそれを認識して適切に動作します。

これは、C#/。NETおよびMS SQL Serverの上に構築されており、それらの技術に固執したいと思います。

私は私の質問はそうと、これはまっすぐ進むようではないかもしれない実現が、私は任意のデザインパターンや、私はソリューションを構築するためにそこにあるかもしれないベストプラクティスを探しています。

答えて

3

1)Windowsに登録されているサービスはそれぞれ、unique idのデータベースに登録してください。

2)サービスが稼動している間は、ハートビートを送信してください。このハートビートは、サービスが最後にチェックインされたときのDateTimeフィールドの更新と同じくらい単純なものにすることができます。データベース内のフィールドを直接更新するか、Webサービスを経由することができます。

3)タスクのセット、およびそのタスクを実行するのマシンの割り当てUNIQUE_IDを定義するテーブルを作成します。これは最初に最初のサーブに来ることができます。マシンはそのように選択したタスクを拾うことができ、このテーブルに自身を登録することによって、そのタスクに対する排他的な権利を取得します。中央集中型コントローラよりもこのアプローチを好むのですが、集中型コントローラがダウンしたときに実行されないタスクについて心配する必要がないためです。

4)ハートビートのタイムアウト値を定義します。分散サービスのそれぞれは、選択されていないタスクまたはタイムアウトしたタスクをチェックします。タスクを実行しているマシンのハートビートのメンテナンスは、タスクの所要時間に依存してはいけません。つまり、タスクAが5分かかる場合、machineAはその5分間の間にハートビートを更新して、machineBがダウンしたものとしてフラグを立てることはありません。

5)タスクの複雑さによっては、作業者が更新するステータス列が必要な場合があります。

0

私のデザインは、実際に仕事を扱う仕事を維持し、配布する中央サービス、およびその他の労働者のサービスになります。したがって、実行するジョブがいくつかある場合、それらは中央サービスのキューに追加され、サービスはワーカーサービスに通知します。次に、各作業者は、実行するジョブを取得しようとします。ジョブがワーカーに割り当てられている場合、ワーカーは、ジョブが成功するか失敗するかによってジョブのステータスを更新します。この設計を使用することで、必要な数のワーカーサービスに容易にスケールアウトすることができます.1つまたは2つの従業員が残りの仕事に影響を与えない場合、他の従業員はそれを取り上げて処理できます。

+0

アイデアをお寄せいただき、ありがとうございました。私は中央のサーバーの部分から遠ざかっていきたいと考えています。 –

0

私のアプローチは、いくつかのコンピュータにそのサービスを配布し、リーダー選挙を処理するためにPAXOSまたは似たアルゴリズムを使用してサービスを調整するだろう。したがって、ノード内のサービスが停止すると、他のサーバーのサービスがその位置を占めることがあります。 より現実的な方法では、私は間違いなくリーダーの選挙を調整するためにApache Zookeeperを使用します。