フロー制御
フロー制御とは何か、そしてそれを手動で制御する方法について説明します。
フロー制御
フロー制御とは何か、そしてそれを手動で制御する方法について説明します。
概要
フロー制御は、メッセージの受信者が高速な送信者によって圧倒されないようにするためのメカニズムです。フロー制御は、データの損失を防ぎ、パフォーマンスを向上させ、信頼性を高めます。これはストリーミング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)