自动重试请求的HTTP状态码是什么?

15

我正在使用混合的 Spring-Cloud + feign + spring-retry 来帮助在客户端上重试请求(所有后端都是基于 Kotlin 的)

我的 Spring Boot 配置如下:

myApp:
  ribbon:
    OkToRetryOnAllOperations: true
    retryableStatusCodes: 404, 503

(注意:OkToRetryOnAllOperations = true仅用于重试POST / PUT请求)

尝试重试404和503 HTTP代码听起来不错,但我无法确定是否存在“经典”或“默认”的错误代码列表可供重试。 这种良好的实践存在吗?

我们假设服务器端所有请求都是幂等的(如果不是,则重试可能会导致问题)。


这些代码也可能与重试请求有关: 408,500,502,504? - Jeremy L
这个回答解决了你的问题吗?哪些HTTP错误不应该触发自动重试? - Michael Freidgeim
2个回答

20

作为一个非常粗略的经验法则:
4XX - 客户端做了一些不好的事情
5XX - 服务器做了一些不好的事情

但这非常取决于实际的 API。
你应该重试 500 吗?也许是因为服务器在连接到数据库时出现了意外的问题。或者,也许你正在发送它一些它不期望的东西,而它没有返回给你 4XX 而是崩溃了。

通常没有太多理由重试 404,除非你期望这个资源会出现。

唯一可以重试的 HTTP 状态码是 408、502、503 和 504。

AWS 客户端还会重试 429。


谢谢您的回复。我认为404在客户端网络问题的情况下是相关的,您觉得呢? - Jeremy L
3
不行,因为这些是服务器返回的错误。你收到404意味着你成功连接到了服务器。 - Alexey Soshin
1
你说得对,如果资源不存在,重试也不可能让它出现...谢谢! - Jeremy L
6
429状态码也可以重试。 - sbenderli
1
只有在知道等待什么的情况下才重试状态码为429的请求。否则,您会创建不必要的负载,而且重试可能会不断消耗配额。 - Robert Hensing

13

通常情况下,我建议使用以下状态码:

  • 408 请求超时
  • 425 过早
  • 429 请求过多
  • 500 内部服务器错误
  • 502 错误的网关
  • 503 服务不可用
  • 504 网关超时

但这主要取决于API的具体情况,如果有文档可以查阅。例如,WhatsApp在发生可重试或不可重试的错误时使用500。


但是418应该重试吗? - Morgan Touverey Quilling
4
不,但是你应该准备好你的杯子。 - Lucas Vazquez
答案太棒了。WhatsApp 让所有东西都变成500,真让人失望。 - granadaCoder
答案太棒了!但是WhatsApp把一切都变成500,真是让人失望。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接