バックプレッシャー
下流の処理能力を超えるデータが流入した際に、上流に対して流量を制御する仕組み
バックプレッシャーとは
バックプレッシャー (Backpressure) は、下流の処理能力を超えるデータが流入した際に、上流に対して流量を制御する仕組みである。水道管の水圧と同じ概念で、処理しきれないデータを溜め込まずに制御する。
バックプレッシャーがない場合
バックプレッシャーがない場合を図で示す。
❌ プロデューサー (1000 msg/秒) → コンシューマー (100 msg/秒)
→ メモリが溢れる、OOM で停止
→ メッセージが失われる
バックプレッシャーの戦略
SQS のようなキューに一時保存するバッファリング、古いメッセージを破棄するドロップ、上流のレートを制限するスロットリング、コンシューマーを増やすスケールアウトの 4 つが基本戦略だ。
SQS によるバックプレッシャー
SQS による バックプレッシャーを図で示す。
API (1000 req/秒) → SQS (バッファ) → Lambda (100 同時実行)
↑ メッセージを蓄積
→ Lambda が処理可能な速度で消費
API Gateway が上流 (クライアント) のレートを制限し、下流 (Lambda) を保護する。
Kinesis のバックプレッシャー
Kinesis のバックプレッシャーを図で示す。
プロデューサー → Kinesis (シャード) → Lambda
シャードの容量: 1 MB/秒 or 1000 レコード/秒
→ 容量を超えると ProvisionedThroughputExceededException
→ プロデューサーがリトライ (バックプレッシャー)
Node.js Streams
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 を一時停止
バックプレッシャーの設計指針
バッファサイズには必ず上限を設定し、無限にバッファリングしない。古いメッセージにはタイムアウトを設けて破棄する。キューの深さをモニタリングし、バックプレッシャーが頻発する場合はコンシューマーのスケールアウトを検討する。バッファが閾値を超えたらアラートで通知する。
実務での活用方法は関連書籍にも詳しい。
この記事は役に立ちましたか?
関連用語
関連する記事
エラーメッセージを読めるエンジニアは何が違うのか
エラーが出たときに冷静に原因を特定できる人と、パニックになる人。その差は経験だけでなく、読んできた本の種類にあります。デバッグ力を支える読書の傾向を分析します。
「あとで読む」ブックマークが 100 件を超えたら本を買え
ブラウザのブックマークに技術記事を溜め込んでいませんか。断片的な記事を 100 件読むより、同じテーマの本を 1 冊読む方が効率的な理由を解説します。
コードレビューが上手い人は何を読んでいるのか
的確なコードレビューができる人は、共通して特定のジャンルの本を読んでいます。レビュー力を支える読書の傾向と、レビューに直結する知識の身につけ方を解説します。