# レイムダック状態 ## 定義 レイムダック(lame duck)状態とは、バックエンドタスクがポートをリッスンしリクエストを処理できる状態のまま、クライアントに対して明示的に新規リクエストの送信を止めるよう求めている状態である。クライアントから見たバックエンドタスクの状態は healthy(正常に処理中)・refusing connections(応答不能。起動中/終了中、または異常状態)・lame duck の3つに分類され、lame duck はこのうち「サービス可能だが新規リクエストを拒否している」中間状態にあたる。(Source: [[@2016__OReilly__SRE Book - Chapter 20 Load Balancing in the Datacenter]]) タスクがlame duck状態に入ると、その事実は全てのアクティブなクライアントへブロードキャストされる。アクティブなTCP接続を持たない非アクティブなクライアントに対しても、Googleの RPC 実装([[Stubby]])は定期的な UDP ヘルスチェックを送り続けているため、クライアントの状態にかかわらずlame duck情報は通常1〜2 RTTという短時間で全クライアントに伝播する。(Source: [[@2016__OReilly__SRE Book - Chapter 20 Load Balancing in the Datacenter]]) lame duck状態を用いた安全なシャットダウンは次の手順を踏む。(1) ジョブスケジューラ([[Borg]])がバックエンドタスクへ SIGTERM を送る。(2) SIGTERM ハンドラ内で明示的に呼び出される RPC 実装の API 経由で、バックエンドタスクはlame duck状態に入り、クライアントへ新規リクエストを他のバックエンドへ送るよう求める。(3) lame duck状態に入る前(またはクライアントが検知する前)に開始されたアクティブなリクエストは通常どおり実行を継続する。(4) 応答がクライアントへ返るにつれ、バックエンドに対するアクティブリクエスト数は徐々にゼロへ近づく。(5) 設定された猶予時間(典型的にはサービス・クライアントの複雑さに応じて10秒〜150秒)の経過後、バックエンドタスクは自らクリーンに終了するか、ジョブスケジューラによって強制終了される。(Source: [[@2016__OReilly__SRE Book - Chapter 20 Load Balancing in the Datacenter]]) ## 横断的知見 - 今後の取り込みで、複数ソース間の突き合わせによる知見を追記する。 ## 未解決の問い - lame duckの猶予時間(10秒〜150秒)を決める「サービス依存」「クライアントの複雑さ依存」という基準は、本ソースでは経験則としてしか語られていない。具体的にどのような要因が猶予時間を長くする方向に働くのかは明記されていない。 - 非アクティブクライアントへのUDPヘルスチェックによる伝播が「通常1〜2 RTT」に収まらないケース(ネットワーク分断・パケットロス時など)にlame duck通知がどの程度遅延しうるかは本ソースに記載がない。 - lame duck状態は正常時のグレースフルシャットダウンの文脈で語られているが、過負荷時の選択的棄却(第21章の適応スロットリングやcriticalityベースの棄却)とどう組み合わさるかは本ソースの範囲外。 ## 関連 - [[負荷分散]] — lame duckは、健全性判定(healthy/refusing connections/lame duckの3状態モデル)を通じてクライアントがどのバックエンドと接続を維持するかを決める前提になる。 - [[Stubby]] — lame duck情報を非アクティブクライアントへも伝播させるUDPヘルスチェックを持つGoogle内部RPC実装。 - [[Borg]] — SIGTERM送信とタスクの強制終了を担うジョブスケジューラ。 - [[@2016__OReilly__SRE Book - Chapter 20 Load Balancing in the Datacenter]] — lame duckが導入される一次ソース。 - [[@2016__OReilly__SRE Book - Chapter 21 Handling Overload]] — 正常時の健全性判定(本概念)と対比される、過負荷時の選択的棄却を扱う章。 ## 出典 - [[@2016__OReilly__SRE Book - Chapter 20 Load Balancing in the Datacenter]](§"Identifying Bad Tasks: Flow Control and Lame Ducks")