Php Laravel中的多个排队工人

Php Laravel中的多个排队工人,php,laravel,Php,Laravel,我已经在supervisor配置中将numprocs指定为8。但每次我分派作业时,它基本上会处理同一作业8次: [2017-08-14 02:00:11] Processed: App\Jobs\UpdateOrders [2017-08-14 03:00:09] Processed: App\Jobs\UpdateOrders [2017-08-14 04:00:07] Processed: App\Jobs\UpdateOrders [2017-08-14 05:00:06] Process

我已经在supervisor配置中将numprocs指定为8。但每次我分派作业时,它基本上会处理同一作业8次:

[2017-08-14 02:00:11] Processed: App\Jobs\UpdateOrders
[2017-08-14 03:00:09] Processed: App\Jobs\UpdateOrders
[2017-08-14 04:00:07] Processed: App\Jobs\UpdateOrders
[2017-08-14 05:00:06] Processed: App\Jobs\UpdateOrders
[2017-08-14 06:00:10] Processed: App\Jobs\UpdateOrders
[2017-08-14 07:00:08] Processed: App\Jobs\UpdateOrders
[2017-08-14 08:00:09] Processed: App\Jobs\UpdateOrders
[2017-08-14 09:06:39] Processed: App\Jobs\UpdateOrders
我的主管配置如下所示:

[program:product-manager]
process_name=%(program_name)s_%(process_num)02d
command=php artisan queue:listen
numprocs=8
autostart=true
autorestart=true
directory=/var/www/html
redirect_stderr=true
stdout_logfile=/var/www/logs/product-manager.log

如果我只分派了一个作业,如何设置它以使它只使用一个工人。或者,如果我分派了8份工作,就使用全部8名工人。是这样吗?我对laravel队列中的多个工人如何工作的想法是否有误?我真正想要的是让每个工作人员在我分派的单独作业上工作。

我问过OP是否可以更新,并说明队列配置。根据该更新,此答案可能被证明是错误的

您的管理器配置正在生成多个工作程序(使用Laravel内置工作程序,它不是超级可扩展的,也不一定是“生产就绪的”,但适合于开发和测试),这些工作程序都试图从队列中使用(我猜可能是数据库表)

队列负责(例如Amazon SQS或AMQP等)确保队列上的消息只传递(使用)一次。我希望您使用的队列不强制执行这一点(如数据库),并且多个工作人员一起使用同一条消息。(有点像。)


可能我对数据库和
artisan
消费者如何工作的理解是错误的——在这种情况下,我相信我会被否决。这就是我开始考虑的地方。

您的队列是如何配置的?您是否正在使用数据库(通过artisan queue:listen)?是的,我正在使用数据库。Laravel支持Beanstalkd、IronMQ、Amazon SQS和Redis。我是否可以使用其中一个来确保每个员工只处理一次作业?你推荐哪一个?是的,所以如果我(受过教育的)对这个问题的猜测是正确的,任何一个都可以。根据我的经验,如果您在AWS上运行生产,Amazon SQS绝对是一个梦想。(我使用了这个绑定:)如果你在
homestead
中运行,那么
beanstalkd
是预安装的(我不确定它是否是预配置的)。它们中的任何一个都将确保消息只被消费一次。我个人在过去曾将RabbitMQ用于非AWS部署,但您知道,它们非常相似。你是在找制作还是开发?我真的不想在排队上花任何钱,所以我想我还是选择beanstalkd或redis吧。我希望在生产中使用它。你提到了拉威尔的内置工人还没有真正做好生产准备,那么你建议我使用什么呢?这取决于你的生产平台。如果您有一个虚拟的私有服务器或专用的tin,您需要自己照顾,我只需要看看您的Linux发行版是否支持beanstalkd或IronMQ,然后根据您觉得合适的内容选择(我没有经验建议哪一个更好)。您可能会发现,查看ServerFault.com有助于获得一些见解。
artisan
命令(带有数据库队列)更像是一个“概念证明”,并不是为了可靠性或效率而设计的,这就是为什么我不会在生产中使用它的原因。(续)——但拉雷维尔排队的目的是将队列平台抽象出来。因此,只需编写一次代码,然后部署到现有的任何基础设施上。因此,如果您将来在AWS上部署,或者您正在部署Redis随附的CPanel实例,那么您可以选择只需对配置文件进行少量更改即可使用这些实例。我的经验法则是总是使用目标平台上最受支持和最简单配置的任何东西——这在开发人员、QA和生产人员之间可能有所不同。