supervisor 开启多个进程,导致队列重复执行
我有个队列用来发送短信通知,之前我配置supervistor的时候只开启了一个进程,所以并没有发现问题。数据多了,我就想多开几个进程,可是当我多开几个进程的时候,一个队列就会重复执行,并且重复执行的次数就是设置的进程数量,比如我numprocs=4,最后就会发送4条短信到同一个手机号上。我队列驱动是database;
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php 项目路径/artisan queue:work queue=sms --sleep=3 --tries=3
autostart=true
autorestart=true
user=forge
numprocs=4
redirect_stderr=true
stdout_logfile=/home/forge/app.com/worker.log
stopwaitsecs=3600
感谢各位的帮助,目前问题已解决。队列驱动换成了redis。
如果你用
database
又开启多个消费者的话,你需要做这几个步骤:1.消费者判断当前数据是否被消费,如果消费过了就不做任何动作
2.消费者消费数据的时候,用悲观锁锁住当前数据,消费完成后标记已经消费
数据库用来做队列不是明智之选。因为mysql数据库并不擅长做队列,包括redis也是。当程序消费者同时消费的过多,会造成mysql性能下降。mysql连接是有上限的,可执行的线程也是有上限的。何况mysql做延迟队列性能也很差,需要一直进行扫描。
综上,建议你换成rabbitmq,rocketmq或者kafka。我觉得rabbitmq挺好用,推荐你使用。