等待就绪
解释如何配置 RPC,使其在发送请求前等待服务器就绪。
等待就绪
解释如何配置 RPC,使其在发送请求前等待服务器就绪。
概述
这是一项可以在 stub 上使用的功能,它会使 RPC 在发送请求之前等待服务器可用。这使得批处理工作流程更加健壮,因为短暂的服务器问题不会导致失败。截止期限仍然适用,因此如果超出截止期限,等待将被中断。
当 channel 连接服务器失败时创建 RPC,如果**不**使用等待就绪 (Wait-for-Ready),RPC 将立即返回失败;如果使用等待就绪,它只会排队等待连接就绪。默认情况下**不**使用等待就绪。
有关详细语义,请参阅此链接。
如何使用 等待就绪
您可以为 stub 指定是否应使用等待就绪 (Wait-for-Ready),该设置在创建 RPC 时会自动传递。
注意
除了服务器未就绪之外,RPC 仍可能因其他原因失败,因此错误处理仍然是必需的。下面展示了当客户端向服务器发送消息时,根据 channel 状态以及是否设置了等待就绪 (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
Handler 相结合(对于支持此功能的语言)。
- 为了提高效率,这可以与实现
- 接受那些本可以通过等待避免的失败,因为您想要快速失败
语言支持
语言 | 示例 |
---|---|
Java | Java 示例 |
Go | Go 示例 |
Python | Python 示例 |
最后修改于 2023 年 8 月 22 日:修复:等待就绪文档页面中的 Go 示例 URL 错误 (#1179) (007035b)