重试模式,如何确定 PHP 中的失败类型
Retry pattern, how to determine type of failure in PHP
我想在 PHP (Guzzle) 中实现重试模式以确定在失败的情况下是否需要再次发送请求。如果我需要,我是否应该在再次发送之前使用一些延迟。注意:这是内部服务通信,每个服务都在缩放组中并在负载均衡器后面,因此我们假设目标 URL 存在 URL 但可能由于某种原因不可用,所有服务器也是如此是 NGINX
重试与否,延迟与否有什么最佳实践吗??
据我所知,状态 503
表示服务器过载,所以在这种情况下,小延迟可能有助于等待新实例启动并帮助分配负载???
如果出现 502/504
错误怎么办,还要延迟重试???
如果出现 500
错误怎么办??根据我的理解,当服务器或一般逻辑出现问题并且我们不需要执行任何重试时,应该抛出 500
???
那 400
呢,就像我们得到 500
一样的动作??
那404
呢?? 404
可以有两种,一种是端点真的不存在(内部服务之间通信我觉得不可能),另一种是请求的资源没有找到(比如user not found通过凭据)。我认为在 404
的情况下我们不需要执行重试
422
我在某些域错误或验证错误的情况下使用,但也许服务器可以在其他情况下 return 它?如果它只是由我触发,我可以假设不需要重试。
其他状态码呢,还有NGINX特有的代码???
我知道我可能需要为每个 URI 案例制定特定的重试策略,但我相信有一些 common/reusable 规则。
我最终得到这样的列表:
- 400 错误请求 - 没有重试
- 401 未经授权 - 无重试
- 402 需要付款 - 不可重试
- 403 禁止 - 不可重试
- 404 未找到 - 正如我之前所说,我假设我们有不同的 404,如果找不到某些资源,如数据库中的用户,如果 404 页面在真正错误的情况下找不到 URL,而不是发现 b-z 平衡问题。因此,如果未找到某些资源,我们将发送一些自定义数据,在这种情况下不重试,在其他情况下,我们将 RETRY
- 405 方法不允许 - 不重试
- 406 不可接受 - 不重试
- 407 需要代理身份验证 - 无需重试
- 408 请求超时 - 重试
- 409 冲突 - 重试
- 410 消失了 - 没有重试
- 411 需要长度 - 无重试
- 412 前提条件失败 - 不重试
- 413 负载太大 - 没有重试
- 414 URI 太长 - 无法重试
- 415 不支持的媒体类型 - 不重试
- 416 范围不满足 - 不重试
- 417 预期失败 - 没有重试
- 421 错误的请求 - 没有重试
- 422 无法处理的实体 - 无重试
- 423 Locked - RETRY 如果指定的锁定时间和时间不太长
- 424 依赖失败 - 没有重试
- 426 需要升级 - 无需重试
- 428 需要先决条件 - 无重试
- 429 请求太多 - 可能重试重试
- 431 请求 Header 字段太大 - 无法重试
- 451 因法律原因不可用 - 不可重试
因此,大多数 4** 客户端错误不应重试。
不应重试的 5** 服务器错误:
- 500 Internal Server Error - no RETRY,在大多数情况下它没有捕获到应用程序错误,所以我们不应该重试它
- 501 未实施 - 无重试
- 502 错误网关 -重试
- 503 服务不可用 - 重试
- 504 网关超时 重试
- 505 不支持 HTTP 版本 - 不重试
- 506 变体也协商 - 无重试
- 507 存储空间不足 - 无法重试
- 检测到 508 循环 - 没有重试
- 510 未扩展 - 无重试
- 511 需要网络身份验证 - 无需重试
这将转到基本重试策略,但正如我所说的,每个请求都应该单独处理,因此大多数请求都会有自己的策略,覆盖一些代码处理并使用不同的重试时间。
我想在 PHP (Guzzle) 中实现重试模式以确定在失败的情况下是否需要再次发送请求。如果我需要,我是否应该在再次发送之前使用一些延迟。注意:这是内部服务通信,每个服务都在缩放组中并在负载均衡器后面,因此我们假设目标 URL 存在 URL 但可能由于某种原因不可用,所有服务器也是如此是 NGINX
重试与否,延迟与否有什么最佳实践吗??
据我所知,状态 503
表示服务器过载,所以在这种情况下,小延迟可能有助于等待新实例启动并帮助分配负载???
如果出现 502/504
错误怎么办,还要延迟重试???
如果出现 500
错误怎么办??根据我的理解,当服务器或一般逻辑出现问题并且我们不需要执行任何重试时,应该抛出 500
???
那 400
呢,就像我们得到 500
一样的动作??
那404
呢?? 404
可以有两种,一种是端点真的不存在(内部服务之间通信我觉得不可能),另一种是请求的资源没有找到(比如user not found通过凭据)。我认为在 404
的情况下我们不需要执行重试
422
我在某些域错误或验证错误的情况下使用,但也许服务器可以在其他情况下 return 它?如果它只是由我触发,我可以假设不需要重试。
其他状态码呢,还有NGINX特有的代码???
我知道我可能需要为每个 URI 案例制定特定的重试策略,但我相信有一些 common/reusable 规则。
我最终得到这样的列表:
- 400 错误请求 - 没有重试
- 401 未经授权 - 无重试
- 402 需要付款 - 不可重试
- 403 禁止 - 不可重试
- 404 未找到 - 正如我之前所说,我假设我们有不同的 404,如果找不到某些资源,如数据库中的用户,如果 404 页面在真正错误的情况下找不到 URL,而不是发现 b-z 平衡问题。因此,如果未找到某些资源,我们将发送一些自定义数据,在这种情况下不重试,在其他情况下,我们将 RETRY
- 405 方法不允许 - 不重试
- 406 不可接受 - 不重试
- 407 需要代理身份验证 - 无需重试
- 408 请求超时 - 重试
- 409 冲突 - 重试
- 410 消失了 - 没有重试
- 411 需要长度 - 无重试
- 412 前提条件失败 - 不重试
- 413 负载太大 - 没有重试
- 414 URI 太长 - 无法重试
- 415 不支持的媒体类型 - 不重试
- 416 范围不满足 - 不重试
- 417 预期失败 - 没有重试
- 421 错误的请求 - 没有重试
- 422 无法处理的实体 - 无重试
- 423 Locked - RETRY 如果指定的锁定时间和时间不太长
- 424 依赖失败 - 没有重试
- 426 需要升级 - 无需重试
- 428 需要先决条件 - 无重试
- 429 请求太多 - 可能重试重试
- 431 请求 Header 字段太大 - 无法重试
- 451 因法律原因不可用 - 不可重试
因此,大多数 4** 客户端错误不应重试。
不应重试的 5** 服务器错误:
- 500 Internal Server Error - no RETRY,在大多数情况下它没有捕获到应用程序错误,所以我们不应该重试它
- 501 未实施 - 无重试
- 502 错误网关 -重试
- 503 服务不可用 - 重试
- 504 网关超时 重试
- 505 不支持 HTTP 版本 - 不重试
- 506 变体也协商 - 无重试
- 507 存储空间不足 - 无法重试
- 检测到 508 循环 - 没有重试
- 510 未扩展 - 无重试
- 511 需要网络身份验证 - 无需重试
这将转到基本重试策略,但正如我所说的,每个请求都应该单独处理,因此大多数请求都会有自己的策略,覆盖一些代码处理并使用不同的重试时间。