tommwq.work/aip

AIP-194 自动重发配置

· [tommwq@126.com]
编号 194
原文链接 https://google.aip.dev/194
状态 批准
创建日期 2019-08-16
更新日期 2019-08-16

远程过程调用可能失败。此时,调用远程过程的客户端需要知道能否安全的重新执行操作。如果多个API使用统一的错误码,客户端可以妥善处理失败。

指南

客户端 应当 自动重发那些重复执行时不会引发意外状态变化的、非事务性的单次调用

客户端 不应 重发事务性请求。相反这些请求 应当 存在应用层级的重发逻辑,从开始处重新执行完整事务。

客户端 不应 自动重发那些重复运行会导致意外状态变化的请求。

注意 本AIP不设计客户端流或双向流。

注意 关于客户端库中的客户端重发行为,请参考AIP-4221

可重发状态码

对于上面提到的可重发的方法,客户端 应当 在遇到以下状态码时重发请求:

  • UNAVAILABLE 此状态码通常由网络故障引起,通常是暂时的。如果预期连接将(很快)恢复,可以重发请求。

不可重发状态码

遇到下列状态码时 不应 自动重发请求:

  • OK 请求成功。
  • CANCELLED 应用服务可以取消请求, 必须 遵守此规则。
  • DEADLINE_EXCEEDED 应用服务可以设置截止时间, 必须 遵守此规则。
  • INVALID_ARGUMENT 重发带有无效参数的请求永远不会得到成功。
  • DATA_LOSS 不可恢复的错误, 必须 立即向应用服务报告。

通常不可重发状态码

遇到以下状态码时,通常 不应 重发请求:

  • RESOURCE_EXHAUSTED 这可能是配额耗尽的信号。因此几小时内重发请求可能都不会成功。同时,重发啊请求可能会产生费用。如果 RESOURCE_EXHAUSTED 用于配额以外的其他原因,并且资源恢复的预期时间较短,可以重发请求。
  • INTERNAL 这个状态码通常意味着系统的某些内部模块失败,通常意味着应该向系统提交错误报告。这种情况 应当 立即向应用服务报告。
  • UNKNOWNINTERNAL 不同,此状态码保留给系统真正未知的错误,因此不可能安全重发请求。这些 应当 立即向应用服务报告。
  • ABORTED 此状态码通常意味着请求由于序列检查不通过或事务中止而失败。 不应 对单个请求重发, 应当 在更高层次(例如整个事务)重新执行。

如果系统不同组件之间没有同步或信号,遇到一些状态码时可以自动重发。例如,客户端可能在读操作遇到 NOT_FOUND 时重发,该操作设计成在资源创建之前一直挂起。当然通常不鼓励这种类型的系统。

因此收到以下状态码时 不应 重发请求:

  • NOT_FOUND 客户端 不应 重发请求,直到资源创建。
  • ALREADY_EXISTS 客户端 不应 重发请求,直到资源被删除。
  • PERMISSION_DENIED 客户端 不应 重发请求,直到获得许可。
  • UNAUTHORIZED 客户端 不应 重发请求,直到获得授权。
  • UNAUTHENTICATED 客户端 不应 重发请求,直到获得认证。
  • FAILED_PRECONDITION 客户端 不应 重发请求,直到系统状态满足。
  • OUT_OF_RANGE 客户端 不应 重发请求,直到范围扩展。
  • UNIMPLEMENTED 客户端 不应 重发请求,直到系统实现接口。

进一步阅读

  • 关于消除并行或重发请求歧义的方法,请参考AIP-154