サービスを少なくとも実行し続けるために、Windowsサービスマネージャーがクラッシュした場合にサービスを自動的に再起動するように調整できます(サービスプロパティの[回復]タブを参照)。これらのプロパティを設定するバッチスクリプトなど、詳細については、こちらをご覧ください-再起動クラッシュした場合のWindowsサービス
高可用性とは、サービスを外部から維持するだけではありません。サービス自体は、高可用性を念頭に置いて構築する必要があります(つまり、全体で優れたプログラミングプラクティスを使用し、適切なデータ構造を使用し、リソースの取得と解放をペアにします)。予想される負荷の下で稼働し続けることを確認するためにテストされました。
べき等コマンドの場合、コマンドを特定の回数再起動することで、断続的な障害(リソースのロックなど)を許容できます。これにより、サービスはクライアントを障害から保護できます(ある程度まで)。クライアントは、障害を予測するようにコーディングする必要もあります。クライアントはいくつかの方法でサービスの失敗を処理できます-ロギング、ユーザーへのプロンプト、X回の再試行、致命的なエラーのロギング、終了はすべて可能なハンドラーです-どちらが適切かは要件によって異なります。サービスに「会話状態」がある場合、サービスがハードに失敗したとき(つまり、プロセスが再開されたとき)、クライアントはこの状況を認識して処理する必要があります。これは通常、現在の会話状態が失われたことを意味します。
単一のマシンはハードウェア障害に対して脆弱になるため、単一のマシンを使用する場合は、冗長コンポーネントがあることを確認してください。HDDは特に障害が発生しやすいため、少なくともミラーリングされたドライブまたはRAIDアレイを用意してください。PSUは次の弱点であるため、UPSと同様に冗長PSUも価値があります。
クラスタリングに関しては、Windowsはサービスクラスタリングをサポートし、個々のコンピューター名ではなくネットワーク名を使用してサービスを管理します。これにより、クライアントは、ハードコードされた名前ではなく、サービスを実行している任意のマシンに接続できます。ただし、追加の対策を講じない限り、これはリソースフェイルオーバーです。つまり、サービスの1つのインスタンスから別のインスタンスにリクエストを送信します。通常、会話状態は失われます。サービスがデータベースに書き込んでいる場合は、それもクラスター化して、信頼性を確保し、ローカルノードだけでなくクラスター全体で変更を利用できるようにする必要があります。
これは実際には氷山の一角にすぎませんが、さらなる研究を始めるためのアイデアが得られることを願っています。
Microsoft Clustering Service(MSCS)