Laravel中的重试方法主要用于排队工作,以控制应继续在放弃之前继续进行工作的时间。它指定了超时时间,在此之后,工作人员将停止尝试重新处理该工作,而不管进行的尝试次数如何。此方法返回DateTime实例,该实例指示重试作业的绝对截止时间。
Laravel中重试方法的常见用例包括:
限制和利率限制工作:
- 与执行率限制的外部API相互作用(例如,每分钟最多10个请求)时,可以反复重复作业,但只能直到特定的截止日期为止。使用重试有助于执行最长的重试期(例如,一小时或24小时),以防止无限期的重试环可能会淹没队列。
- 当作业失败是由于第三方服务施加的临时费率限制或限制,需要多次重复但不是永远的。
基于时间的尝试而不是基于计数:
- 重试可以用作$ Tries属性的替代方案,该属性定义了最大的重试尝试。
- 而不是按数字限制重试的尝试,而是按时间重试限制。该作业将尽可能多地重试,直到指定的时间限制为止。
- 当难以估计可能需要多少尝试以及时间约束比确切的重试计数更重要时,这可能会有所帮助。
处理高失败概率操作:
- 对于将HTTP请求发送到不稳定的第三方API之类的操作,可能会偶尔失败,重试允许作业继续尝试,但仅在明智的超时窗口中。
- 这降低了工作过早放弃工作的风险,同时也确保他们不会永远浪费资源。
随着超时的优雅退化:
- 如果作业涉及可能超时或暂时放慢速度的漫长操作或下游依赖关系,则设置重试设置可以使开发人员设定全球超时边界,超越重试作业变得毫无意义。
- 这有助于保持队列的移动,并防止无限期阻止资源的工作或减慢工作。
将重试与工作中间件相结合:
- 重试后,与作业中间件(例如限制费率或节流中间件)相结合,可以控制工作队列处理率。
- 例如,当提交数千个工作限制为某个吞吐量时,重试可以设置作业的寿命。如果一项工作反复被限制并重新加入,它最终将在重试时间赛后停止重试,避免了无限的重试循环。
- 这种模式有助于区分真正的失败和由于费率限制而被延迟的工作。
自定义重试逻辑:
- 开发人员有时会使用重试实施自定义重试策略。例如,人们可能会在方法中添加逻辑,以根据系统负载或API状态等外部条件动态扩展或减少重试时间。
- 这为重试机制增加了固定数量的重试或固定超时的灵活性。
区分失败和检索:
- 重试可以通过防止过度侵略性的作业重试,但在重试窗口内,可以帮助清理错误日志。
- 开发人员可以在作业句柄方法中实现/捕捉尝试/捕获,如果在重试超时之前发生了不可回复的异常,则可以明确失败。
- 这使得允许重任工作不断重试直到超时,而失败的工作立即停止,从而提高了失败状态的清晰度。
限制利率的工作超时:
- 由于费率限制呼叫而被释放回队列的作业将增加尝试计数,因此重试可以充当故障安全计时器。
- 当利率有限的工作不断被释放和重试时,重试保证他们不会在设定的超时期限内重试。
实际示例:
- 一封电子邮件发送每5分钟恢复工作,但在1小时后停止重试。
- 如果外部付款网关响应错误或超时,则付款处理工作将不断重试30分钟。
- API集成工作,重试24小时,以尊重API率限制和临时降低。
Laravel的队列文档重点介绍了重试,以指定应重述作业的最长时间。如果两者都存在,它将覆盖$ tries属性。开发人员设定重试将来的时间戳,超过Laravel将不再尝试这份工作。
尽管有实用性,但一些开发人员注意到重试行为的限制,例如在工作链式场景中被忽略,或者如果不满足重试条件,则从排队中忽略了工作。同样,重试方法不会直接处理逻辑,例如增加尝试或捕获异常,这些异常必须在作业的手柄方法或其他中间件中进行处理。
总而言之,重试是Laravel的一种强大方法,用于根据时间而不是尝试数量来控制排队的工作重试寿命。它通常用于重试与利率受限的API相互作用,具有高失败概率的操作以及执行优美的重试时间表,从而改善了Laravel队列处理系统的稳健性和控制。