在啥情况下 REST API 应该返回 HTTP 状态 503

Posted

技术标签:

【中文标题】在啥情况下 REST API 应该返回 HTTP 状态 503【英文标题】:In what circumstances a REST API should return HTTP Status 503在什么情况下 REST API 应该返回 HTTP 状态 503 【发布时间】:2017-07-08 03:39:07 【问题描述】:

标准说:

10.5.4 503 服务不可用。由于服务器临时过载或维护,服务器当前无法处理请求。言下之意是,这是一种暂时的情况,会在一段时间后得到缓解。

参考号:https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

如果服务器在数据库访问级别存在锁冲突,在这种情况下服务器是否应该返回 503。或者 503 状态是否意味着:

网络过载 DOS 类型情况 负载平衡最大化 显式维护窗口。

在什么其他情况下返回 HTTP 状态 503 是有意义的。

非常感谢任何详细的说明。

【问题讨论】:

【参考方案1】:

假设服务遇到数据库争用。没有关于服务器必须做什么的规则。但是,如果您认为问题是暂时的并且会在一段时间后得到解决,您可以选择返回 503。您可以指定 Retry-After 标头以通知调用者何时可以重试。这对于允许调用者自动从问题中恢复特别有用。您可以将它用于其他一些场景,并且调用者可以在指定时间段后自动重试。

状态码有两个用途

    让来电者知道发生了什么 让来电者知道他接下来可以做什么

向呼叫者发送带有 Retry-After 的 503 为呼叫者提供了比发送 500 更多的选项。当然,呼叫者可以完全忽略 Retry-After 并将其视为 500,但您作为服务提供商是提供更多信息和选项。

【讨论】:

【参考方案2】:

The updated spec,供参考。

如果服务器在数据库访问级别存在锁冲突,在这种情况下服务器是否应该返回 503

请记住,在 REST 模型中,HTTP 状态码不是用来描述服务中的问题;他们改为描述文档存储中的类似条件。

503 是文档存储说“我太忙了,稍后再试”的方式。

在什么其他情况下返回 HTTP 状态 503 是有意义的。

背压。来自Martin Thompson

应用背压是应对持续高负载的一种有效技术,这样可以在不降低已接受请求和事务的系统性能的情况下提供最大吞吐量。

当我们需要支持 REST 等同步协议时,请使用背压(由网关处的完整传入队列发出信号)发送有意义的“服务器繁忙”消息,例如 HTTP 503 状态代码

【讨论】:

以上是关于在啥情况下 REST API 应该返回 HTTP 状态 503的主要内容,如果未能解决你的问题,请参考以下文章

如果 REST API 方法失败,我应该返回 200、400 还是 500 HTTP 状态消息?

在啥情况下 [ [ UIApplication sharedApplication ] keyWindow ] 返回 nil?

在带有 HTTP 状态代码 405 的 REST API 中返回啥错误消息?

返回 REST API 中错误 HTTP 方法的代码?

在啥情况下我们应该将类构造函数设为私有[重复]

在啥情况下你应该更喜欢使用 std::copy 写入 cout?