バックプレッシャー

下流の処理能力を超えるデータが流入した際に、上流に対して流量を制御する仕組み

非同期耐障害性

バックプレッシャーとは

バックプレッシャー (Backpressure) は、下流の処理能力を超えるデータが流入した際に、上流に対して流量を制御する仕組みである。水道管の水圧と同じ概念で、処理しきれないデータを溜め込まずに制御する。

バックプレッシャーがない場合

❌ プロデューサー (1000 msg/秒) → コンシューマー (100 msg/秒)
  → メモリが溢れる、OOM で停止
  → メッセージが失われる

バックプレッシャーの戦略

SQS のようなキューに一時保存するバッファリング、古いメッセージを破棄するドロップ、上流のレートを制限するスロットリング、コンシューマーを増やすスケールアウトの 4 つが基本戦略だ。

SQS によるバックプレッシャー

API (1000 req/秒) → SQS (バッファ) → Lambda (100 同時実行)
                     ↑ メッセージを蓄積
                     → Lambda が処理可能な速度で消費

API Gateway が上流 (クライアント) のレートを制限し、下流 (Lambda) を保護する。

Kinesis のバックプレッシャー

プロデューサー → Kinesis (シャード) → Lambda
  シャードの容量: 1 MB/秒 or 1000 レコード/秒
  → 容量を超えると ProvisionedThroughputExceededException
  → プロデューサーがリトライ (バックプレッシャー)

Node.js Streams

import { createReadStream, createWriteStream } from 'fs';

const readable = createReadStream('large-file.csv');
const writable = createWriteStream('output.csv');

readable.pipe(writable);
// pipe() が自動的にバックプレッシャーを処理
// writable が遅い場合、readable を一時停止

バックプレッシャーの設計指針

バッファサイズには必ず上限を設定し、無限にバッファリングしない。古いメッセージにはタイムアウトを設けて破棄する。キューの深さをモニタリングし、バックプレッシャーが頻発する場合はコンシューマーのスケールアウトを検討する。バッファが閾値を超えたらアラートで通知する。

実務での活用方法は関連書籍にも詳しい。

関連用語