为了账号安全,请及时绑定邮箱和手机立即绑定

Laravel 自定义队列不尊重 retry_after

Laravel 自定义队列不尊重 retry_after

PHP
桃花长相依 2022-07-29 10:31:52
我在使用自定义 laravel 队列连接/队列时遇到了一些问题。这个特定的连接/队列用于可能需要 5 分钟到 10 小时的作业(大型数据聚合和数据重建)我有一个主管 conf 定义为[program:laravel-worker-extended]process_name=%(program_name)s_%(process_num)02dcommand=php /var/www/artisan queue:work --queue=refreshQueue,rebuildQueue --sleep=3 --timeout=86400 --tries=2 --delay=360autostart=trueautorestart=trueuser=rootnumprocs=4redirect_stderr=truestdout_logfile=/var/www/storage/logs/queue-worker.log我有一个队列连接定义为:        'refreshQueue' => [            'driver' => 'database',            'table' => 'jobs',            'queue' => 'refreshQueue',            'retry_after' => 420,   // Retry after 7 minutes        ],我通过以下命令使用命令将作业添加到队列中:AggregateData::dispatch()->onConnection('refreshQueue')->onQueue('refreshQueue');构造 DatabaseQueue 时,retryAfter 定义为 420。但是这是我的工作日志:[2020-01-22 18:25:37] local.INFO: BEGINNING AGGREGATION  [2020-01-22 18:25:37] local.INFO: Aggregating data  [2020-01-22 18:27:08] local.INFO: BEGINNING AGGREGATION  [2020-01-22 18:27:08] local.ALERT: AGGREGATION FAILED: Aggregation in progress 为什么当我明确告诉它在 420 之后重试时,它会在 90 秒后继续重试?我已经重建了我的容器,重新启动了队列,并完成了我可以调试的所有其他事情......然后等待一段时间,我得到了最终的日志输出:[2020-01-22 18:25:37] local.INFO: BEGINNING AGGREGATION  [2020-01-22 18:25:37] local.INFO: Aggregating data  [2020-01-22 18:27:08] local.INFO: BEGINNING AGGREGATION  [2020-01-22 18:27:08] local.ALERT: AGGREGATION FAILED: Aggregation in progress  [2020-01-22 18:33:04] local.INFO: [COMPLETE] Aggregating data  [2020-01-22 18:33:04] local.INFO: Queue job finishedIlluminate\Queue\CallQueuedHandler@call我不太明白为什么队列在 90 秒后继续重试作业。我在这里做错了吗?在此处编辑一些其他上下文:此方法in_progress在开始时设置一个标志,因此它不能在同一时间运行两次。日志可以解释为:BEGINNING AGGREGATIONhandle():工作方法的第一行AGGREGATION FAILED: Aggregation in progress:failed()作业的方法通过异常处理失败。这一行表明它再次尝试了该作业,并且遇到了设置为1已经表示另一个作业正在处理的标志。当作业完成或遇到不同的异常(不是“进行中”)时,此标志将重置为 0。Queue job finishedIlluminate\Queue\CallQueuedHandler@call我在服务提供者中添加了进一步调试以侦听队列完成事件。
查看完整描述

2 回答

?
森林海

TA贡献2011条经验 获得超2个赞

这可能与您正在使用的时间超时有关。从文档

--timeout 值应始终比您的 retry_after 配置值短几秒钟。这将确保处理给定作业的工作人员总是在重试作业之前被杀死。如果您的 --timeout 选项比您的 retry_after 配置值长,您的作业可能会被处理两次。


查看完整回答
反对 回复 2022-07-29
?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

我已经弄清楚了这里的问题。在queue.php我定义一个连接 refreshQueue。但是,在我的主管 conf 中,我使用的是:

command=php /var/www/artisan queue:work --queue=refreshQueue,rebuildQueue --sleep=3 --timeout=86400 --tries=2 --delay=360

作为命令 ( --queue),命令应该是:

command=php /var/www/artisan queue:work refreshQueue --sleep=3 --timeout=86400 --tries=2 --delay=360

注意缺少--queue连接有定义,而retry_after不是队列本身。

这是关于连接与队列差异的宝贵经验。


查看完整回答
反对 回复 2022-07-29
  • 2 回答
  • 0 关注
  • 293 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信