我试图让一些微服务更具弹性,并且重试某些类型的HTTP请求会对此有所帮助。
重试超时会给客户带来非常缓慢的体验,所以我不打算在这种情况下重试。重试400s并不会有帮助,因为错误的请求在几毫秒之后仍然是一个错误的请求。
我想还有其他原因可以不重试其他几种类型的错误,但是哪些错误和原因?
答案 0 :(得分:9)
有些错误不应该重试,因为它们似乎是永久性的:
因此,不应重试大多数4 **客户端错误。
不应重试的5 ** Servers错误:
但是,为了使微服务更具弹性,您应该使用Circuit breaker模式,并在上游关闭时快速失败。
答案 1 :(得分:2)
4xx代码表示在呼叫方发生了错误。可能是错误的URL,错误的身份验证凭据或任何表明请求错误的内容。因此,在没有解决该问题的情况下,无法使用重试。该错误位于调用者的域中,并且调用者应修复该错误,而不是希望它会自行修复。
有例外。假设该服务正在重新部署或重新启动。在这种情况下,没有注册端点,因此将发送4xx http代码。但是,稍后,服务器可能可用。因此,重试似乎是有益的。
更深入的分析将表明,服务在重新启动时应为滚动重启,以防止中断。因此,先前的论点不再成立。但是,如果您的环境/生态系统未遵循此做法,并且您认为由于上述原因值得重试客户端报告的错误(4xx代码),则可以选择这样做;否则,您可以选择这样做。但是成熟的系统无法做到这一点,因为没有任何好处,并且失去了快速故障处理能力。
5xx错误代码应重试,因为它们是服务错误。它们可以是短期的(线程溢出,相关的服务拒绝连接)或长期的(系统缺陷,相关的系统中断,基础结构不可用)。有时,服务会以信息(通常是标头)回信,无论信息是永久的还是临时的。有时是关于何时重试的时间参数。根据这些参数,呼叫者可以选择是否重试。
出于明显的原因,无需重试1xx,2xx和3xx代码。