取消

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