バックプレッシャー
下流の処理能力を超えるデータが流入した際に、上流に対して流量を制御する仕組み
非同期耐障害性
バックプレッシャーとは
バックプレッシャー (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 を一時停止
バックプレッシャーの設計指針
バッファサイズには必ず上限を設定し、無限にバッファリングしない。古いメッセージにはタイムアウトを設けて破棄する。キューの深さをモニタリングし、バックプレッシャーが頻発する場合はコンシューマーのスケールアウトを検討する。バッファが閾値を超えたらアラートで通知する。
実務での活用方法は関連書籍にも詳しい。