私は現在サーバーアプリケーションに取り組んでおり、一定レベルのサービスを維持することに同意しています。保証したいサービスのレベルは次のとおりです。サーバーがリクエストを受け入れ、サーバーがクライアントに確認応答を送信した場合、サーバーがクラッシュした場合でも、リクエストが発生することを保証します。リクエストは長時間実行される可能性があり、確認応答時間は短くする必要があるため、リクエストを永続化し、クライアントに確認応答を送信してから、リクエストを実行するためのさまざまなアクションを実行することで、これを実装します。アクションが実行されると、それらも永続化されるため、サーバーは起動時にリクエストの状態を認識します。また、ログの正確性をチェックするための外部システムとのさまざまな調整メカニズムもあります。
これはすべてかなりうまく機能しているように見えますが、フォールトトレラントコードをテストするのは非常に難しいため、確信を持ってこれを言うのは困難です。これまでに2つの戦略を考え出しましたが、どちらも完全に満足のいくものではありません。
- 外部プロセスにサーバーコードを監視させ、外部プロセスがテストの適切なポイントであると判断した時点でサーバーコードを強制終了します。
- 特定の既知の重要なポイントをクラッシュさせるアプリケーションのコードを追加します
最初の戦略に関する私の問題は、外部プロセスがアプリケーションの正確な状態を知ることができないため、コード内で最も問題のあるポイントに到達していることを確認できないことです。2番目の戦略に関する私の問題は、フォールトテイクをより細かく制御できますが、オプションのコンパイルなどを使用しても、アプリケーション内にフォールトを挿入するコードが好きではないことです。フォールトを見落とすのは簡単すぎるのではないかと心配しています。注入ポイントとそれを本番環境に滑り込ませます。