流控制
解释了流控制是什么,以及如何手动控制它。
流控制
解释了流控制是什么,以及如何手动控制它。
概述
流控制是一种机制,用于确保消息接收方不会被发送速度过快的发送方所淹没。流控制可以防止数据丢失,提高性能并增加可靠性。它适用于流式 RPC,而不适用于一元 RPC。默认情况下,gRPC 会为你处理流控制相关的交互,但有些语言允许你覆盖默认行为并进行显式控制。
gRPC 利用底层传输机制来检测何时可以安全地发送更多数据。当接收端读取数据时,会向发送方返回一个确认,告知发送方接收方还有更多容量。
根据需要,gRPC 框架会在写调用返回之前进行等待。在 gRPC 中,当一个值被写入流时,这并不意味着它已经通过网络发送出去。而是说它已经被传递给了框架,框架现在将负责处理缓冲它并将其发送给操作系统以便通过网络传输的各种细节。
注意
从服务器向客户端写入的流与从客户端向服务器写入的流相同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)