哪些HTTP错误永远不会触发自动重试?

时间:2017-12-06 18:02:51

标签: http microservices hystrix spring-retry

我试图让一些微服务更具弹性,并且重试某些类型的HTTP请求会对此有所帮助。

重试超时会给客户带来非常缓慢的体验,所以我不打算在这种情况下重试。重试400s并不会有帮助,因为错误的请求在几毫秒之后仍然是一个错误的请求。

我想还有其他原因可以不重试其他几种类型的错误,但是哪些错误和原因?

2 个答案:

答案 0 :(得分:9)

有些错误不应该重试,因为它们似乎是永久性的:

  • 400 Bad Request
  • 401 Unauthorized
  • 402需付款
  • 403 Forbidden
  • 405方法不允许
  • 406不可接受
  • 需要407代理验证
  • 409冲突 - 取决于
  • 410 Gone
  • 411长度
  • 412 Precondition Failed
  • 413 Payload Too Large
  • 414 URI太长
  • 415不支持的媒体类型
  • 416范围不满意
  • 417期望失败
  • 418我是一个茶壶 - 不确定这个
  • 421误导请求
  • 422 Unprocessable Entity
  • 423已锁定 - 取决于资源平均锁定的时间长度(?)
  • 424依赖关系失败
  • 426需要升级 - 可以自动升级客户端吗?
  • 428必要条件 - 我不认为前提条件可以 第二次完成,没有从一开始就重新开始 整个过程但取决于
  • 429请求太多 - 取决于但是不应该快速重试
  • 431请求标头字段TooLarge
  • 451因法律原因不可用

因此,不应重试大多数4 **客户端错误。

不应重试的5 ** Servers错误:

  • 500内部服务器错误
  • 501未实施
  • 502 Bad Gateway - 我看到用于临时错误,因此取决于
  • 不支持505 HTTP版本
  • 506 Variant也谈判
  • 507存储空间不足
  • 检测到508循环
  • 510 Not Extended
  • 需要511网络验证

但是,为了使微服务更具弹性,您应该使用Circuit breaker模式,并在上游关闭时快速失败。

答案 1 :(得分:2)

4xx代码表示在呼叫方发生了错误。可能是错误的URL,错误的身份验证凭据或任何表明请求错误的内容。因此,在没有解决该问题的情况下,无法使用重试。该错误位于调用者的域中,并且调用者应修复该错误,而不是希望它会自行修复。

有例外。假设该服务正在重新部署或重新启动。在这种情况下,没有注册端点,因此将发送4xx http代码。但是,稍后,服务器可能可用。因此,重试似乎是有益的。

更深入的分析将表明,服务在重新启动时应为滚动重启,以防止中断。因此,先前的论点不再成立。但是,如果您的环境/生态系统未遵循此做法,并且您认为由于上述原因值得重试客户端报告的错误(4xx代码),则可以选择这样做;否则,您可以选择这样做。但是成熟的系统无法做到这一点,因为没有任何好处,并且失去了快速故障处理能力。

5xx错误代码应重试,因为它们是服务错误。它们可以是短期的(线程溢出,相关的服务拒绝连接)或长期的(系统缺陷,相关的系统中断,基础结构不可用)。有时,服务会以信息(通常是标头)回信,无论信息是永久的还是临时的。有时是关于何时重试的时间参数。根据这些参数,呼叫者可以选择是否重试。

出于明显的原因,无需重试1xx,2xx和3xx代码。