# ヘルスチェック
## 定義
ヘルスチェック(health check)は、アプリケーションやサービスが要求に応えられる状態にあるかを外部から問い合わせて確かめる仕組みである。[[Mike Julian]] は、アプリケーション内に健全性を返す HTTP エンドポイントを置き、その裏の独立したコードが依存先(データベース、キャッシュ、外部 API など)の状態やデプロイ済みバージョンを確かめて、正常なら HTTP 200、異常なら 503 を返す形を「/health エンドポイントパターン」と名付けた。プッシュ型のメトリクスと違ってプル型であり、ロードバランサやサービスディスカバリの振り分け判断、デバッグ、アプリケーション自身による健全性の把握に使える一方、実装の手間とエンドポイントを監視するツールの追加が必要になる(§7.3)(Source: [[@2019__OReillyJapan__入門 監視 - Chapter 7 アプリケーション監視]])。
## 未解決の問い
- 依存先まで確かめる深いヘルスチェックをロードバランサの振り分けに使うと、共有依存先の障害で全インスタンスが同時に外れうる。監視用の深いチェックと振り分け用の浅いチェックをどこで分けるべきか。
- 書き込み・読み出し・削除まで一巡する重いチェックは信頼性を上げるが、チェック自体の負荷と頻度の上限をどう決めるか。
- 200/503 の二値応答で足りるのか、それとも lame duck のような中間状態を返す多値の応答が要るのか。
## 未編纂の観察
- [[@2019__OReillyJapan__入門 監視 - Chapter 7 アプリケーション監視]] はヘルスチェックを健全性を保つ側の道具として扱い、リスクには触れない。[[@2016__OReilly__SRE Book - Chapter 22 Addressing Cascading Failures]] は、クラスタスケジューラのヘルスチェック再起動が過負荷時には不健全化の原因になりうるとし、プロセスのヘルスチェック(バイナリが生きているか)とサービスのヘルスチェック(このリクエストクラスに今応答できるか)の区別と、一時的な無効化を求める(Source: [[@2019__OReillyJapan__入門 監視 - Chapter 7 アプリケーション監視]], [[@2016__OReilly__SRE Book - Chapter 22 Addressing Cascading Failures]])。
- [[@2019__OReillyJapan__入門 監視 - Chapter 7 アプリケーション監視]] の応答は HTTP 200 か 503 の二値で、アプリケーションの外からプルされる。[[@2016__OReilly__SRE Book - Chapter 20 Load Balancing in the Datacenter]] は healthy・refusing connections・lame duck の 3 状態と、非アクティブなクライアントにも状態を伝える UDP ヘルスチェックを使う([[レイムダック状態]])。規模が大きくなると状態の表現と伝播の速さが設計対象になる(Source: [[@2019__OReillyJapan__入門 監視 - Chapter 7 アプリケーション監視]], [[@2016__OReilly__SRE Book - Chapter 20 Load Balancing in the Datacenter]])。
## 関連
- [[@2019__OReillyJapan__入門 監視 - Chapter 7 アプリケーション監視]] — /health エンドポイントパターンの命名と実装例
- [[@2016__OReilly__SRE Book - Chapter 20 Load Balancing in the Datacenter]] / [[@2016__OReilly__SRE Book - Chapter 22 Addressing Cascading Failures]]
- [[レイムダック状態]] / [[マイクロサービスアーキテクチャ]]
## 出典
- Mike Julian 著、松浦隼人 訳, *入門 監視*, オライリー・ジャパン, 2019, 第 7 章 §7.3.