バックプレッシャー
コンシューマの処理速度がプロデューサに追いつかないとき、入力バッファが際限なく膨らんでシステムが落ちるのを防ぐための仕組み。
対処法は主に四つある。ドロップ(メッセージを捨てる)、バッファリング(一定量まで待つ)、ブロック(プロデューサを止める)、クレジット方式(コンシューマが処理可能な量を通知する)。TCPはウィンドウサイズでクレジット方式を実現している。Reactive Streams(RxJava、Project Reactor、Akka Streams)は、プロセス内でのバックプレッシャーを標準化したものだ。
典型的な落とし穴は、無制限バッファ=バックプレッシャーなし=高負荷時のOOM、という図式である。Kafkaはコンシューマのオフセットコミットを、自然なバックプレッシャー信号として使っている。