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

如何防止队列系统同时处理一个队列中的多个作业?

如何防止队列系统同时处理一个队列中的多个作业?

PHP
偶然的你 2022-09-03 17:00:30
我有很多任务,应该按正确的顺序处理。我想按“类型”将它们划分为不同的队列。应动态创建队列。然后我想启动 X workers,它将处理队列中的任务。但有一个重要的规则 - 从每个队列中,一次只应处理一个任务。原因是 - 指定类型的每个任务都可以更改应用程序的状态,因此,如果最后一个任务尚未完成,则我无法开始处理相同类型的新任务。我想将Laravel队列系统与Redis驱动程序一起使用,但我不确定它是否能够做到这一点。如何防止队列系统同时从每个队列中取出多个作业?有什么想法吗?提前感谢您的帮助。
查看完整描述

2 回答

?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

如果您正在使用,那么这就是您可以在文件中执行的操作。supervisor.conf


[program:laravel-worker]

process_name=%(program_name)s_%(process_num)02d

command=php /var/www/html/****/artisan queue:work

autostart=true

autorestart=true

user=root

numprocs=1  <----- this is what you are looking for

redirect_stderr=true

stdout_logfile=/var/www/html/****/storage/logs/supervisord.log

numprocs 指令将指示 Supervisor 运行 1 个 queue:work 进程并对其进行监视,如果失败,则自动重新启动它。(Laravel Queue Supervisor Doc)


查看完整回答
反对 回复 2022-09-03
?
九州编程

TA贡献1785条经验 获得超4个赞

作业链接允许您指定在主作业成功执行后应按顺序运行的排队作业的列表。如果序列中的一个作业失败,则不会运行其余作业。要执行排队的作业链,您可以在任何可调度作业上使用该方法。withChain


如果要指定应用于链接作业的默认连接和队列,可以使用 and 方法。allOnConnectionallOnQueue


ProcessPodcast::withChain([

    new OptimizePodcast,

    new ReleasePodcast

])->dispatch()->allOnConnection('redis')->allOnQueue('podcasts');


查看完整回答
反对 回复 2022-09-03
  • 2 回答
  • 0 关注
  • 82 浏览

添加回答

举报

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