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

Fla*_*ame 11 php worker laravel

我在代码库中遇到一个问题,即作业被提前终止,而其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

任何人都对这种配置有一定的经验,并且可以通过示例说明差异吗?

Sna*_*pey 7

我的理解如下。

当工作人员决定开始一项作业时,它会在reserved_at作业列中放置一个时间戳。此预订的价值取决于retry_after价值。该字段位于未来,告诉其他工作人员该作业正在进行中,尽管仍在作业表中。

如果工作人员本身崩溃,则该作业仍保留在作业表中,因此它reserved_at是一个时间戳而不是简单的布尔值,以便工作人员知道何时不再信任它。

一旦served_at时间过去,工作人员就可以重试该作业(假设还有剩余的尝试次数)

超时适用于队列级别和单个作业级别。尽管 Mohamed Said 的书中没有说明,但我假设超时是队列超时或作业本身超时中的最高超时。

因此,如果队列的超时时间为 60 秒,则可以通过其公共timeout属性为单独且冗长的作业提供更长的超时时间。

无论以哪种方式定义超时,如果作业在允许的超时时间内没有完成,那么它会被工作人员强制终止。

如果超时时间长于 则retry_after作业的第一个实例在reserved_at时间到期时仍可能正在执行。然后,这允许另一个工作人员启动该作业的第二个实例,从而导致不可预测的结果。