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

What's the difference between `retry_after` and `timeout` options for Laravel queues?

我在我的代码库中遇到了一个问题,即作业在其 timeout 设置为 540 秒时被提前终止。但是,在查看文档后,我注意到 retry_after 参数存在问题,我现在将其增加到 600 秒,从而解决了该问题。文档 https://laravel.com/docs/7.x/queues 在文档中有一个块说明:

The --timeout value should always be at least several seconds shorter than your retry_after configuration value. This will ensure that a worker processing a given job is always killed before the job is retried. If your --timeout option is longer than your retry_after configuration value, your jobs may be processed twice.

但是,我已经阅读了几次文档,但我无法解释 retry_aftertimeout 选项之间的区别。 --timeout 似乎是与作业相关的设置,而 retry_after 似乎是与工作人员相关(进程)的设置。此外,--timeout 可以作为参数传递给 php artisan queue:work ...,但 retry_after 是要在 config/queue.php.

中定义的配置 属性

有人对这种配置有一些经验,可以举例说明区别吗?

我的理解如下

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

如果 worker 本身崩溃了,那么这个工作仍然保留在工作 table 中,所以 reserved_at 是一个时间戳而不是一个简单的布尔值,这样工作人员就知道什么时候它不再是值得信赖。

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

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

因此,如果队列的超时时间为 60 秒,则可以通过其 public timeout 属性.[=16= 为单个冗长的作业提供更长的超时时间]

无论超时是如何定义的,如果作业在允许的超时时间内没有完成,那么它就会被工作人员强行终止。

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