取消

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