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_after
和 timeout
选项之间的区别。 --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结果。
我在我的代码库中遇到了一个问题,即作业在其 timeout
设置为 540 秒时被提前终止。但是,在查看文档后,我注意到 retry_after
参数存在问题,我现在将其增加到 600 秒,从而解决了该问题。文档 https://laravel.com/docs/7.x/queues 在文档中有一个块说明:
The
--timeout
value should always be at least several seconds shorter than yourretry_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 yourretry_after
configuration value, your jobs may be processed twice.
但是,我已经阅读了几次文档,但我无法解释 retry_after
和 timeout
选项之间的区别。 --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结果。