当数据库(或上游服务)超时时,我应该发送 503 还是 504?

Luk*_*ett 5 http

如果一个网站依赖于上游数据库或其他抽象服务或存储(基本上是人类已知的大多数网站),那么当上游请求因超时而终止时,我应该返回 503 还是 504?

503服务不可用

服务器当前不可用(因为过载或停机维护)。一般来说,这是一种临时状态。有时,这在测试服务器上也可能是永久性的。

504网关超时

服务器充当网关或代理,没有收到上游服务器的及时响应。

504 感觉更适合代理服务器、缓存或其他 Web 基础设施,但 503 也不正确,因为服务很好,当前请求恰好终止,也许搜索可能过于广泛或其他什么。

那么根据 HTTP 的说法,哪一个是“正确的”呢?

卢克

EJK*_*EJK 5

如果这是一个临时情况,只需等待即可解决,503 听起来很合适。 http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html指出:“这意味着这是一种临时情况,延迟一段时间后会得到缓解。”

500听起来也合适。RFC 指出:“服务器遇到了意外情况,导致其无法满足请求。 ”数据库无响应是一种异常/意外情况。

IMO,归根结底是这样的:您是否提供了一个错误代码来帮助调用者(即 HTTP 客户端)响应这种情况?在这种情况下,客户端除了稍后重试之外别无他法。鉴于此,我会保持简单并返回 500。我认为客户更有可能关心该网站是否可用,而不太可能关心具体原因。另外,更少的响应代码使得对客户端进行编码变得更容易。再说一遍,这只是我的意见。

  • 谢谢,这是一个很好的答案。我试图避免 500,因为这是一般情况,并且会调用电子邮件来提供支持。我们认为 500 确实是意外的,因此是代码中的中断或错误。有时,当数据库受到攻击时,我们会遇到超时,但它们并不是需要调查的事情。 (2认同)