等待就绪

解释了如何配置 RPC 以等待服务器就绪后再发送请求。

等待就绪

解释了如何配置 RPC 以等待服务器就绪后再发送请求。

概述

这是一个可用于存根(stub)的功能,它将使 RPC 在服务器可用之前等待,然后再发送请求。这使得批处理工作流更加健壮,因为临时的服务器问题不会导致失败。截止日期(deadline)仍然适用,因此如果超出截止日期,等待将被中断。

当通道未能连接到服务器时创建 RPC,如果不使用 Wait-for-Ready,它将立即返回失败;而使用 Wait-for-Ready,它将简单地排队,直到连接变为就绪状态。默认情况是**不使用** Wait-for-Ready。

有关详细语义,请参见此处

如何使用 Wait-for-Ready

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

以下显示了客户端根据通道状态以及是否设置 Wait-for-Ready 向服务器发送消息时发生的事件序列。

sequenceDiagram
participant A as Application
participant RPC
participant CH as Channel
participant S as Server 
A->>RPC: Create RPC using stub
RPC->>CH: Initiate Communication
alt channel state: READY
  CH->>S: Send message
else Channel state: IDLE or CONNECTING
  CH-->>CH: Wait for state change
else Channel state: TRANSIENT_FAILURE
  alt with Wait-for-Ready
    CH-->>CH: Wait for channel<br>becoming READY<br>(or a permanent failure)
    CH->>S: Send message
  else without Wait-for-Ready
    CH->>A: Failure
  end
else Channel state is a Permanent Failure
    CH->>A: Failure
end

以下是基于状态的视图

stateDiagram-v2
   state "Initiating Communication" as IC
   state "Channel State" as CS
   IC-->CS: Check Channel State
   state CS {
      state "Permanent Failure" as PF
      state "TRANSIENT_FAILURE" as TF
      IDLE --> CONNECTING
      CONNECTING --> READY
      READY-->[*]
      CONNECTING-->TF
      CONNECTING-->PF
      TF-->READY
      TF -->[*]: without\n wait-for-ready
      TF-->PF
      PF-->[*]
   }
  state "MSG sent" as MS
  state "RPC Failed" as RF
  CS-->WAIT:From IDLE /\nCONNECTING
  CS-->WAIT:From Transient\nFailure with\nWait-for-Ready
  WAIT-->CS:State Change 
  CS-->MS: From READY
  CS-->RF: From Permanent failure or\nTransient Failure without\nWait-for-Ready
  MS-->[*]
  RF-->[*]

替代方案

  • 循环(带指数退避)直到 RPC 停止返回瞬时故障。
    • 为了提高效率,这可以与实现 onReady 处理程序(对于支持此功能的语言)相结合。
  • 接受可能通过等待避免的故障,因为您想要快速失败。

语言支持

语言示例
JavaJava 示例
GoGo 示例
PythonPython 示例