フロー制御

フロー制御とは何か、そしてそれを手動で制御する方法について説明します。

フロー制御

フロー制御とは何か、そしてそれを手動で制御する方法について説明します。

概要

フロー制御は、メッセージの受信側が高速な送信側によって圧倒されないようにするためのメカニズムです。フロー制御は、データ損失を防ぎ、パフォーマンスを向上させ、信頼性を高めます。ストリーミング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

言語サポート

言語
JavaJavaの例