取消

解释如何以及何时取消 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)