取消

解释如何以及何时取消 RPC。

概述

当 gRPC 客户端不再关心 RPC 调用的结果时,可以取消该调用,以向服务器发出终止关注的信号。截止时间到期和 I/O 错误也会触发取消。当 RPC 被取消时,服务器应停止正在进行的计算并结束其流的处理。通常,服务器本身也是上游服务器的客户端,因此取消操作应理想地传播到系统中所有由于原始客户端 RPC 调用而启动的正在进行的计算。

客户端可能出于多个原因取消 RPC。请求的数据可能已经变得不再相关,或者客户端的作者希望作为服务器的良好公民来节约计算资源。

image 2024 12 24 09 10 13 411

在客户端取消 RPC 调用

客户端通过调用调用对象上的方法,或者在某些语言中通过调用附带的上下文对象上的方法来取消 RPC 调用。虽然 gRPC 客户端不会向服务器提供关于取消原因的详细信息,但取消 API 调用时会传入一个描述原因的字符串,这将导致客户端抛出异常和/或记录日志,日志中包含所提供的原因。当服务器收到 RPC 被取消的通知时,应用程序提供的服务器处理程序可能正在忙于处理请求。一般来说,gRPC 库没有中断应用程序提供的服务器处理程序的机制,因此,服务器处理程序必须与 gRPC 库协调,以确保本地请求处理的停止。因此,如果 RPC 是长期存在的,其服务器处理程序必须定期检查它所服务的 RPC 是否已被取消,如果已取消,则停止处理。一些语言会自动取消任何传出的 RPC,而在其他语言中,服务器处理程序的作者则需要负责这一操作。

image 2024 12 24 09 11 37 641

语言支持

语言 示例 备注

Java

示例

自动取消传出的 RPC

Go

示例

自动取消传出的 RPC

C++

示例

自动取消传出的 RPC

Python

示例