✅laravel框架延时队列,有延时问题[已解决]
1. 运行环境
1). 当前使用的 Laravel 版本?
6.20.44.
2). 当前使用的 php/php-fpm 版本?
PHP 版本:7.4.27
4). 业务环境
生产环境
2. 问题描述?
A框架使用延迟3秒队列
在B框架里消费队列业务,但是他执行时间是在延迟队列需执行时间的30秒到2分钟左右。
command=/usr/local/php/bin/php /data/backend/mapi/artisan queue:work
--queue customer_event_change
--delay=3
--sleep=5
--memory=128
--timeout=60
--tries=3
3. 您期望得到的结果?
减少延迟时间
4. 您实际得到的结果?
在B框架里消费队列业务,但是他执行时间是在延迟队列需执行时间的30秒到2分钟左右。
我排除了数据挤压,服务器时间
5. 问题溯源
经过排查找到问题,有业务同学将是queue文件的redis下block_for配置为180秒
`blockFor` 方法通常与队列任务一起使用,用于指定在任务被处理之前应该阻塞多长时间。当队列工作器(worker)尝试从队列中获取任务时,如果队列中没有任务可用,`blockFor` 方法会告诉工作器阻塞多长时间后再尝试获取任务。
6. 解决方案
为了减少业务的改动,在queue文件redis配置同级中增加配置
'redis' => [
'driver' => 'redis',
'connection' => 'job',
'queue' => 'mapi',
'retry_after' => 120,
'block_for' => 180,
],
'job_redis' => [
'driver' => 'redis',
'connection' => 'job',
'queue' => 'mapi',
'retry_after' => 90,
'block_for' => 10,
],
启动消费对列是时增加选择驱动配置。
php artisan queue:work job_redis --queue=customer_event_change
高版本的框架可以尝试
php artisan queue:work --queue=customer_event_change --connection=mapi_redis
是不是業務本身執行時間比較長 只啟動了一個進行 下一個任務需要等待
检查下几台机器的时间设置,是否一致
php artisan tinker
now()
没懂 "A框架" "B框架" 是什么意思?消费进程的任务都是一个一个来的,前一个执行慢了就会阻塞后面的执行,所以也无法保证延迟队列“准时”执行,如果想并发执行,简单的方法就是多开几个消费进程。