Laravel 队列中 `retry_after` 和 `timeout` 选项有什么区别?

9
在我的代码库中,我遇到了一个问题,在作业的 timeout 设置为540秒时,作业提前终止。然而,在查看文档后,我发现这是由于 retry_after 参数引起的问题,我已将其增加到600秒,这样问题就解决了。文档https://laravel.com/docs/7.x/queues在文档中有一个块声明:

--timeout 值始终应比您的 retry_after 配置值少几秒钟。这将确保正在处理给定作业的工作进程始终在作业重试之前被终止。如果您的 --timeout 选项长于您的 retry_after 配置值,则可能会处理两次作业。

但是,我已经多次阅读了文档,但无法简述 retry_aftertimeout 选项之间的区别。 --timeout 似乎是与作业相关的设置,而 retry_after 似乎是与工作进程相关的设置。此外,可以将 --timeout 作为参数传递给 php artisan queue:work ...,但 retry_after 是要在 config/queue.php 中定义的配置属性。
有人对此配置有经验,并能通过示例说明差异吗?

我也想知道。阅读文档几次后仍然无法完全理解两者之间的区别。 - Max Flex
1个回答

5
我的理解如下。
当工作者决定启动作业时,它会在作业的reserved_at列中放置一个时间戳。这个预订的值是基于retry_after值的。该字段的未来值告诉其他工作者该作业正在处理中,尽管仍然在作业表中。
如果工作者本身崩溃,则作业仍保留在作业表中预订状态,因此reserved_at是时间戳而不是简单的布尔值,以便工作者知道何时不能再信任它。
一旦过去了reserved_at时间,那么工作者可以重试该作业(假设还有剩余尝试次数)。
超时适用于队列级别和单个作业级别。虽然在Mohamed Said的书中没有说明,但我假设超时是队列超时或作业超时中最高的超时时间。
因此,如果队列超时为60秒,则可以通过其公共timeout属性为单个且耗时较长的作业提供更长的超时时间。
无论如何定义超时时间,如果作业在允许的超时时间内未完成,则工作者将强制终止该作业。
如果超时时间比retry_after长,则第一次实例的作业可能仍在执行,而reserved_at时间已过期。然后,另一个工作者可以启动作业的第二个实例,从而导致不可预测的结果。

你的前三段言简意赅。读完那部分后,我现在理解了Laravel文档所说的内容。 - Flame

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接