バックプレッシャー
Back Pressure
キューが溜まりすぎてシステムが崩壊するのを防ぐため、キューサイズに上限を設け、満杯なら受付を断る(503を返す)仕組み。処理能力を超える流入を抑えて全体を守る。
なぜ必要か: 受けすぎると共倒れ
キューは便利ですが、流入が処理能力を上回り続けると、キューが無限に膨らみます。やがてメモリを食い尽くし、ディスクへのスワップが始まり、全体が激遅に。最悪システムごとダウンします。1人も救えなくなる最悪の結末です。
図を描画中...
バックプレッシャーの発想
『全部受け付けて共倒れ』より、『捌ける分だけ受け、溢れたら正直に断る』方が賢い。これがバックプレッシャー(逆向きの圧力)です。
キューに上限を設け、満杯になったら新規リクエストには『今は忙しい(HTTP 503 Service Unavailable)』を返します。クライアントは後で出直してくれます。
図を描画中...
Exponential Backoff(指数的後退)
断られたクライアントが即座に何度も再試行すると、復旧しかけたシステムにまた殺到してしまいます。そこで再試行の間隔を指数的に伸ばします: 1秒後 → 2秒後 → 4秒後 → 8秒後…。これで殺到を散らし、システムが落ち着く余地を作ります。
たとえ話: 行列の入場制限
人気店が、店内が満員のときに『申し訳ありません、満席です。後ほどお越しください』と入場を断るのと同じ。全員を無理に詰め込んで将棋倒し(=崩壊)になるより、入場制限して店内の人だけは快適に過ごせる方が、結果的に多くの人を満足させられます。
つまずきポイント
- 『断る』のは敗北ではなく、全体を守る積極的な防御策。受け付けて全滅するより良い。
- 上限値のチューニングが肝。負荷テストで適切な値を見つける。
- クライアント側の再試行は必ずexponential backoffにする。即時リトライ連打は『リトライストーム』を招き、復旧を妨げる。