取消
解释了何时以及如何取消 RPC。
取消
解释了何时以及如何取消 RPC。
概述
当 gRPC 客户端不再关心某个 RPC 调用的结果时,它可以*取消*该调用,以向服务器发出停止处理的信号。截止期限过期和 I/O 错误也会触发取消。当 RPC 被取消时,服务器应停止任何正在进行的计算并结束其流端。通常,服务器也是上游服务器的客户端,因此取消操作理想情况下应传播到系统中因原始客户端 RPC 调用而启动的所有正在进行的计算。
客户端可以出于多种原因取消 RPC。它请求的数据可能已变得无关紧要,或者客户端的作者可能希望作为服务器的“好公民”,以节省计算资源。
sequenceDiagram
Client ->> Server 1: Cancel
Server 1 ->> Server 2: Cancel
在客户端取消 RPC 调用
客户端通过调用调用对象上的方法或(在某些语言中)伴随的上下文对象上的方法来取消 RPC 调用。虽然 gRPC 客户端不会向服务器提供有关取消原因的额外详细信息,但取消 API 调用会接受一个描述原因的字符串,该字符串将导致包含所提供原因的客户端异常和/或日志。当服务器收到 RPC 取消的通知时,应用程序提供的服务器处理程序可能正在忙于处理请求。gRPC 库通常没有中断应用程序提供的服务器处理程序的机制,因此服务器处理程序必须与 gRPC 库协调,以确保本地请求处理停止。因此,如果 RPC 是长生命周期的,其服务器处理程序必须定期检查其正在服务的 RPC 是否已被取消,如果已取消,则停止处理。某些语言还将支持自动取消任何传出 RPC,而在其他语言中,服务器处理程序的作者需要对此负责。
flowchart LR
subgraph Client
end
subgraph Server1
direction TB
cancelled{cancelled?} -->|false| perform("perform some work")
perform --> cancelled
cancelled -->|true| cleanup("cancel upstream RPCs")
cleanup --> exit("exit RPC handler")
end
subgraph Server2
end
Client -->|CANCEL| Server1
Server1 -->|CANCEL| Server2
语言支持
语言 | 示例 | 备注 |
---|---|---|
Java | 示例 | 自动取消传出 RPC |
Go | 示例 | 自动取消传出 RPC |
C++ | 示例 | 自动取消传出 RPC |
Python | 示例 |
上次修改时间 2024年2月29日: 使用绝对路径而非绝对 URL (#1268) (4f733b4)