3

Windows 用のサービスを作成しようとしていますが、冗長性の計画を立てる必要があります。これにより、アプリケーション内の何かに障害が発生した場合に再び起動されます。これを達成するためにマルチスレッドを使用できるかどうか疑問に思っています。

私の考えは、それぞれが別々のタスクを処理する 2 つのスレッドを作成することです。また、各スレッドで他のスレッドを監視して、まだ実行されていることを確認したいと思います。そうでない場合は、そのスレッドの新しいインスタンスを起動する必要があります。これは実現可能ですか?どのスレッド技術を使用しますか: ミューテックス、共有メモリ、セマフォなど...? これが正しいアプローチではない場合、2 つの別個のサービスを記述して IPC を使用するだけでよいでしょうか?

4

4 に答える 4

4

障害時にサービスを再起動させる最も簡単な方法は、Windows に任せることです。サービスを自動再起動するように設定するだけで、とても簡単です。これは、サービスのインストーラー中にプログラムで行うこともできます。これを行う方法のガイドについては、次の投稿を参照してください: Building a Windows Service – Part 4: Extending the Service Installer .

これが「冗長性」を提供することに関しては、これはそうではありません。冗長性の適切な定義は、それらが複数あることを意味します。これは、複数のサービスを使用しているか、複数のホストで複数のサービスを使用している可能性があります。必要に応じてミューテックスを使用して同期できるため、単一のホストに複数のサービスを配置する方が簡単です。

本当の問題は、このサービスが何をしているのかということです。

サービスが、たとえばデータベースまたはメッセージ キューからタスクをポーリングしている場合、同期は自動的に処理されます。作業を複製することなく、複数のサービスがすべて独立して実行および処理できるように、データベースをモデル化するだけです。これで冗長性が得られました。

于 2012-05-16T18:06:12.967 に答える
3

はい、それは実行可能な解決策のように聞こえます。ダブル スレッドの唯一の問題は、アプリケーションがクラッシュすると両方のスレッドが停止することです (バックグラウンド スレッドの場合)。ワーカー プロセスがクラッシュするたびに、ウォッチドッグが起動し、新しいインスタンスを作成して実行します。

于 2012-05-16T18:02:02.200 に答える
2

Windows サービスで使用されるクラス ライブラリとしてアプリケーションを簡単に作成できます (ビジュアル スタジオのテンプレート。インストーラーを追加する必要があります)。この方法でアプリケーションを実行すると、何かが失敗した場合の動作をいつでも設定できます。つまり、常に再起動し、数回再起動し、その後誰かに電子メールを送信するか、この別のアプリケーションを実行するなどです。

資格情報を持っている Windows ボックスに組み込まれており、面倒な作業はすべて自動的に行われます。常に起動して実行する必要があるサービスについては、常に簡単です。

これを行うには、サービス タイプを [自動] に設定します (これにより、ボックスが再起動された場合に再起動されます)。最初の 3 回の再起動に必要なオプションがあり、管理ウィンドウ内から必要なものを設定できます。サービスセクション。

詳細: Windows サービスのドキュメント

于 2012-05-16T18:07:27.650 に答える
0

さまざまなケースをカバーする最も堅牢なソリューションは、ワーカープロセスを開始および停止できるウォッチドッグプロセスを使用することです。WCFを使用して、プロセス間でシグナル(またはその他の情報)を送受信します。アイデアは、ウォッチドッグプロセスを単純に保ち、限られた一連のタスクの実行中に失敗する可能性がほとんどないようにすることです。次に、すべての危険なロジックをワーカープロセスに配置します。

障害またはワーカープロセスの状態をウォッチドッグプロセスに伝達するためのプロトコルを考え出します。ここにいくつかのアイデアがあります。このリストは、完全なリストではありません。

  • ウォッチドッグは、ステータスレポートをタイムリーに受信しない場合、ワーカープロセスを再開します。
  • ウォッチドッグは、障害ステータスレポートを受信すると、ワーカープロセスを再開します。
  • ウォッチドッグは、メモリリークを検出すると、ワーカープロセスを再開します。
  • ウォッチドッグは、実行されていない場合、ワーカープロセスを開始します。

最後の項目を除いて、Windowsサービスコントロールマネージャーは他の3つのケースを処理できません。これが、ウォッチドッグプロセスのアイデアが好きな理由の1つです。もう1つの理由は、メインロジックがブロッキング呼び出しでハングアップする可能性があるためです。状態が破損するためお勧めしませんのでThread.Abort、とにかくワーカープロセスを強制終了する以外に選択肢はほとんどありません。

また、メインロジックを可能な限りフォールトトレラントにするようにしてください。そうすれば、強制的に終了する必要がある場合に、残された混乱を回復してクリーンアップするのがはるかに簡単になります。これは、DBトランザクションや巧妙なファイル操作などのアトミック操作を使用することを意味する場合があります。

于 2012-05-16T19:37:20.093 に答える