フロー制御

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

フロー制御

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

概要

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