自动重试请求的 http 代码是啥?

Posted

技术标签:

【中文标题】自动重试请求的 http 代码是啥?【英文标题】:What are the http codes to automatically retry the request?自动重试请求的 http 代码是什么? 【发布时间】:2019-01-17 02:22:50 【问题描述】:

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

我的 spring-boot conf 是这样的:

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

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

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

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

【问题讨论】:

这些代码也可能与重试请求相关:408、500、502、504 ? 【参考方案1】:

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

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

通常没有太多理由重试 404,除非您预计该资源会出现。

唯一对重试有效的 HTTP 代码是 408、502、503 和 504

【讨论】:

感谢您的回复。我认为 404 在客户端出现网络问题的情况下是相关的,你不觉得吗? 不,因为这些是服务器返回的错误。你得到 404 的事实意味着你设法到达服务器。 你说得对,如果资源不存在,重试就不可能出现...谢谢! 429s 也可以重试。 只有在知道等待什么的情况下才重试 429。您正在创建过度的负载,并且您的重试可能会不断耗尽速率限制配额。

以上是关于自动重试请求的 http 代码是啥?的主要内容,如果未能解决你的问题,请参考以下文章

使用 jQuery 在失败时重试 AJAX 请求的最佳方法是啥?

Angular 7 - 如何在某些响应状态代码上重试 http 请求?

远程服务器错误 请稍后重试 是啥原因?

Alamofire/RxSwift 如何在状态码 401 上自动刷新令牌和重试请求

如何使用 OkHttp/Retrofit 重试 HTTP 请求?

编写装饰器实现python请求错误重试功能