【バックプレッシャー】

バックプレッシャー とは?

最終更新:
💡 受け取れる量に合わせて、上流のデータを調整する

データを受け取る側の処理能力に合わせて、送る側から流れる量を調整する仕組み。受信側にデータが無制限にたまることを避けるために使う。要求数を伝える方式や、書き込みを待つ方式などがある。

📌 このページのポイント
受け取れる量を、上流へ伝える送る側Publisher受け取る側Subscriberデータ要求:request(n)累計の要求数を超えて、要素を送らない
Reactive Streamsの要求数による方式の概念図。紙は送るデータ、画面は受信処理。上の右向き矢印はデータ、下を回る矢印は受け取り要求です。実際のAPIはSubscription経由で、満杯のエラーを起こしてから必ず停止を通知する図ではありません。
ひよこ ひよこ
バックプレッシャーって何をするの?
ペンギン先生 ペンギン先生
受け取る側の処理能力に合わせて、上流から流れるデータ量を調整するんだ。送り続ける速さと処理する速さが合わないと、待ちデータが増え続けることがある。その増加を抑えるための仕組みだよ
ひよこ ひよこ
バッファが満杯になってから止めるの?
ペンギン先生 ペンギン先生
それだけではないよ。Reactive Streamsでは、受信側がrequest(n)で受け取る数を要求する。送信側は累計の要求数を超えて要素を送らないので、満杯になってから必ず「遅くして」と伝える方式とは違うんだ
ひよこ ひよこ
他にはどうやって調整するの?
ペンギン先生 ペンギン先生
Node.jsのストリームでは、write()がfalseを返したら追加の書き込みを待ち、drainで再開できることを知る方法があるよ。どのイベントやAPIを使うかは、仕組みによって異なるんだ
ひよこ ひよこ
ためたり捨てたりすれば、同じこと?
ペンギン先生 ペンギン先生
バッファにためるだけでは、上流の量は減らないよ。捨てる方法はデータが失われるので、用途に合うか考える必要がある。上流への制御を守ることや、ためる量の上限も大切。導入するだけで、すべての過負荷や障害を防ぐ保証ではないんだ
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「バックプレッシャー」って出てきたら「処理が追いつかないときに上流を抑制する仕組み」と思えればだいたいOK!
📖 おまけ:英語の意味
「Back Pressure」 = 背圧・逆圧
💬 下流の状態が上流の送り方に影響するイメージの言葉。データ処理では、受け取れる量に合わせて流れを調整する意味で使うよ

参考資料

← 用語集にもどる