laravel5.1redis队列重复执行问题

在使用Laravel 5.1的Redis队列时,发现任务出现了重复执行的问题。文章详细探讨了这个问题的原因,可能涉及到消息确认机制的故障或者是配置错误。并提供了解决方案,包括检查队列消费者的ACK设置,优化队列配置以及确保在任务处理完成后正确删除队列消息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

按照官方邮件发送配置完后,将任务添加到队列中,
$job = (new SendReminder($withdrawal))->onQueue('emails')->delay(10);
$this->dispatch($job);
然后服务端启动队列监听,
php artisan queue:listen --queue=emails
却发现任务一直执行,也就是一直会收到邮件。


按理说,生产者将任务加入队列,消费者从队列中取任务消费,应该是先进先出,只执行一次才对呀,可是为什么会一直执行?

安装上redisadmin后查看,发现添加的任务一直保留在队列中,没有被取走(删除)。并且这条任务的状态变为了reserved(保留的)。

然后在网上发现了这篇文章(http://yansu.org/2014/04/11/redis-queue-in-laravel.html),它讲了laravel使用redis作为队列系统的执行流程。
其中讲了什么情况下任务的状态会变为reserved。


像我这种发送通知的任务,正好可以用到。只发送一次(有可能失败,准确性要求不是很高),在handle方法开始加上
$this->job->delete();后,任务就只会最多执行一次了。


最后总结一下怎样才能尽快的发现问题和解决问题:
第一,要从不同的角度(或者眼光)看待同一个问题,就像盲人摸象一样,你可能看到的只是一条腿,只有你接触了耳朵、鼻子...,才能认识真正的问题是什么;这里面是指不要在同一个方向上面纠结,有时候换个角度验证可以更早地发现真正的问题所在;
第二,工具的使用,专业的工具相比(蹩脚的工具),可能会使你发现问题和解决问题的能力提高10倍;在这个问题里面是指redisadmin和redis命令行;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值