高可用性は一部の処理を意図的に失敗させることで保たれる

分散システムが処理能力の限界に近づいたとき、すべての要求を受け付け続けると、キューや接続などの資源が枯渇する。 応答の遅延がタイムアウトと再試行を呼び、依存するサービスまで巻き込む過程は、無制限な再試行は部分障害を全体障害へ増幅するで扱った。

この連鎖を断つには、処理できない要求を入り口で拒否したり、上限を超えたメッセージを破棄したりして、資源使用量を制限する必要がある。 下流の余力がないことを上流へ伝えるバックプレッシャーを組み合わせれば、上流は即座に失敗を返す、再試行の間隔を延ばす、送信量を減らすといった対応を選べる。

意図的な失敗が守るのは、個々の要求の成功率ではなく、システム全体を制御可能な状態に保つことである。 たとえば、メールシステムが過負荷の迷惑メール判定を迂回すれば、判定機能を一時的に失ってもメールの送受信は続けられる。 どの処理を拒否または迂回できるかを事前に決めることで、全面停止ではなく部分的な可用性を選べる。

高可用性は、すべての機能を常に成功させることではない。 失敗させる範囲と条件を定め、小さく予測可能な失敗へ封じ込める設計である。

https://bravenewgeek.com/designed-to-fail/

#reliability #load-shedding #backpressure #distributed-system