SDN
← 概念一覧へ
非同期処理

バックプレッシャー

Back Pressure

キューが溜まりすぎてシステムが崩壊するのを防ぐため、キューサイズに上限を設け、満杯なら受付を断る(503を返す)仕組み。処理能力を超える流入を抑えて全体を守る。

キーポイント
  • 問題: キューが際限なく大きくなるとメモリを超え、キャッシュミス・ディスク読み・性能低下を招く。
  • 対策: キューサイズに上限を設け、高スループットと良好な応答時間を維持する。
  • 満杯時はクライアントに『server busy / HTTP 503』を返し、後で再試行してもらう。
  • 再試行はexponential backoff(指数的に間隔を空ける)で、殺到を防ぐ。
トレードオフ

バックプレッシャーは『一部のリクエストをあえて断る』ことで、システム全体の崩壊を防ぐ。受け付けないことでユーザーに一時的な不便(503エラー)を強いるが、無制限に受け付けて全体がダウンするよりはるかにマシ、という割り切り。上限値の設定が難しく、低すぎると無駄に断り、高すぎると守りきれない。

なぜ必要か: 受けすぎると共倒れ

キューは便利ですが、流入が処理能力を上回り続けると、キューが無限に膨らみます。やがてメモリを食い尽くし、ディスクへのスワップが始まり、全体が激遅に。最悪システムごとダウンします。1人も救えなくなる最悪の結末です。

図を描画中...

バックプレッシャーの発想

『全部受け付けて共倒れ』より、『捌ける分だけ受け、溢れたら正直に断る』方が賢い。これがバックプレッシャー(逆向きの圧力)です。

キューに上限を設け、満杯になったら新規リクエストには『今は忙しい(HTTP 503 Service Unavailable)』を返します。クライアントは後で出直してくれます。

図を描画中...

Exponential Backoff(指数的後退)

断られたクライアントが即座に何度も再試行すると、復旧しかけたシステムにまた殺到してしまいます。そこで再試行の間隔を指数的に伸ばします: 1秒後 → 2秒後 → 4秒後 → 8秒後…。これで殺到を散らし、システムが落ち着く余地を作ります。

たとえ話: 行列の入場制限

人気店が、店内が満員のときに『申し訳ありません、満席です。後ほどお越しください』と入場を断るのと同じ。全員を無理に詰め込んで将棋倒し(=崩壊)になるより、入場制限して店内の人だけは快適に過ごせる方が、結果的に多くの人を満足させられます。

つまずきポイント

  • 『断る』のは敗北ではなく、全体を守る積極的な防御策。受け付けて全滅するより良い。
  • 上限値のチューニングが肝。負荷テストで適切な値を見つける。
  • クライアント側の再試行は必ずexponential backoffにする。即時リトライ連打は『リトライストーム』を招き、復旧を妨げる。

関連する概念

この概念で腕試し

関連する 3 問のクイズに挑戦できます。

クイズを解く