等待服务器准备就绪(Wait-for-Ready)

概述

这是一个可以在存根上使用的功能,它会导致 RPC 等待服务器准备好后再发送请求。这可以确保在出现临时的服务器问题时不会导致失败,从而支持更为健壮的批处理工作流。截止时间仍然适用,因此如果超时,等待会被中断。

当创建一个 RPC 调用时,如果通道无法连接到服务器,在没有启用 Wait-for-Ready 的情况下,会立即返回失败;而启用 Wait-for-Ready 后,它会被简单地排队,直到连接准备就绪。默认情况下是没有启用 Wait-for-Ready。

有关详细的语义,请参见 此文档

如何使用 Wait-for-Ready

可以指定存根是否应该使用 Wait-for-Ready,这将在创建 RPC 时自动传递。

RPC 仍然可能因为服务器未准备好以外的原因而失败,因此仍然需要处理错误。

以下展示了客户端向服务器发送消息时发生的事件序列,这取决于通道的状态以及是否启用了 Wait-for-Ready。

image 2024 12 24 11 37 18 347

状态视图

image 2024 12 24 11 38 13 940

替代方案

  • 可以实现一个循环(使用指数回退),直到 RPC 不再返回临时失败。

    • 对于支持此功能的语言,可以结合使用 onReady 处理程序,以提高效率。

  • 如果希望尽早失败,也可以接受一些可能通过等待避免的失败。

语言支持

语言 示例

Java

Java 示例

Go

Go 示例

Python

Python 示例