フロー制御
フロー制御とは何か、そしてそれを手動で制御する方法について説明します。
フロー制御
フロー制御とは何か、そしてそれを手動で制御する方法について説明します。
概要
フロー制御は、メッセージの受信側が高速な送信側によって圧倒されないようにするためのメカニズムです。フロー制御は、データ損失を防ぎ、パフォーマンスを向上させ、信頼性を高めます。ストリーミングRPCに適用され、ユニタリーRPCには関係ありません。デフォルトでは、gRPCはフロー制御とのやり取りを処理しますが、一部の言語では、デフォルトの動作をオーバーライドして明示的に制御することができます。
gRPCは、基盤となるトランスポートを利用して、より多くのデータを送信しても安全なタイミングを検出します。受信側でデータが読み取られると、受信側にはさらに容量があることを送信側に知らせる確認応答が返されます。
必要に応じて、gRPCフレームワークは、書き込み呼び出しから戻る前に待機します。gRPCでは、ストリームに値が書き込まれた場合、それがネットワーク経由で送信されたことを意味するわけではありません。むしろ、それがフレームワークに渡され、フレームワークがバッファリングやネットワーク経由でOSに送信するという細かい詳細を処理するようになります。
注意
クライアントがサーバーに書き込む場合と同様に、サーバーからクライアントに書き込む場合もフローは同じです。sequenceDiagram
participant SA as Sender Application
participant SG as Sender gRPC Framework
participant RG as Receiver gRPC Framework
participant RA as Receiver Application
SA-)+SG: Stream Write
alt sending too fast
SG--)SG: Wait
end
alt allowed to send
SG--)-SA: Write call returns
SG->>RG:Send Msg
end
RA->>RG: Request message
Note right of RA: Request can be done either<br>after or before message arrives
RG->>RA: Provide message
RG->>SG: Send Ack w/ msg size
opt waiting messages
SG->>RG: Send Next Msg
end
警告
クライアントとサーバーの両方が同期読み取りを実行しているか、手動フロー制御を使用しており、両方が読み取りを行わずに大量の書き込みを試みると、デッドロックが発生する可能性があります。言語サポート
言語 | 例 |
---|---|
Java | Javaの例 |
最終更新日:2023年10月5日:flow-control.mdのタイプミスを修正(#1196)(338a44d)