したがって、ここにREST API呼び出しを介して別のサービスにリクエストをポストするアプリケーションがあります。他のサービスが稼働していることを確認するために、アプリケーション内にヘルスチェックを実装する必要があります。私はここでソフトウェアnoobと私の質問はこれです:
他のサービスにpingして、それらが稼働しているかどうかを確認するのはいつですか?アプリケーションの起動時(これは1回限りのことです)、またはREST他のサービスへのAPI呼び出しを行うクライアントを初期化するときですか?
上記の回答には完全に同意しません。Kubernetesのレディネスプローブコンセプトの例を取り上げます。
アイデアは、トラフィックを受け入れる準備ができるまで、リクエストをポッドにルーティングしないようにすることです。 However, the readiness probe will continue to be called throughout the lifetime of the container, every periodSeconds, so that the container can make itself temporarily unavailable when one of its dependencies is unavailable
サービス(コンテナーにデプロイされている)がトラフィックを処理できない場合(たとえば、データベースがダウンしていて、重大な依存関係があるため)、タイムアウトが発生する(したがってブロックされる可能性があるため)リクエストを送信することはできません。スレッド)、カスケードエラー、およびコンソールファイルとログファイルの多数のスタックトレース。
回路ブレーカーの概念とまったく同じです。If a service can handle your requests just don't call it
。 Fail-Fast
は、最終的に内部エラー応答を送信するために5秒間待機するユーザーよりも優れています。
つまり、これらすべてはサービスの存続期間全体に適用されますが、start-up
の間にも適用する必要があると思います。
これは、書き込み用にファイルを開く前にファイルが存在するかどうかをテストする、古典的なI/Oミスに似ています。開こうとすると、もう存在しない可能性があります。
サービスを使用するときに、サービスをテストします。以前はありませんでした。使用前のテストでは、記入しようとしているフィールドが失われる可能性があることをユーザーに警告するように言ってください。サービスは、テストと使用の間で自由に上下できます。フィールドをローカルに保持して、もう一度使用することをお勧めします。
もちろん、ユーザーが自由にテストできるようにしてもかまいませんが、これをワークフローに強制しないでください。それは完全に無意味です。
しないでください。真剣に。並行分散システムは難しいため、これが理由です。とにかく可用性を保証できないため、使用前のテスト(「ヘルスチェック」)では、システム設計に競合状態が組み込まれるだけです。 APIエンドポイントは、常にテストと使用の間でフォールオーバーできます。
クライアントの観点から見ると、エンドポイントがダウンしていることによる障害と、ネットワークの一時的な原因による障害との間に違いがないことを考慮してください。非可用性は非可用性です-なぜクライアントにとって重要ではありません。あなたの最善の策は、エラーを元に戻して再試行するか、ログに記録して失敗するか、それ以外の何かを行うことです。
そして、あなたが学んでいる間、ACMのデジタルライブラリ( http://dl.acm.org )は6月30日まですべての人に公開されています。無料で入手できます-強くお勧めします。