流量控制
解释什么是流量控制以及如何手动控制它。
流量控制
解释什么是流量控制以及如何手动控制它。
概述
流量控制是一种机制,用于确保消息的接收者不会被快速的发送者淹没。流量控制可以防止数据丢失,提高性能并增加可靠性。它适用于流式 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)