Php Laravel中的多队列

Php Laravel中的多队列,php,laravel,queue,Php,Laravel,Queue,我正在laravel中创建一个web应用程序,用户在多个游戏中进行竞价。投标由前端用户和cron job执行。Cron job在每一秒后对每一个游戏进行竞价。因此,在同一时间访问同一行时,投标之间会发生一些冲突。为了解决并发问题,我决定使用laravel队列进行投标。但我有多个游戏,因此我想同时出价的每一场比赛。我不希望同一个游戏的出价在同一时间被处理,因为这样会出现并发问题。我想知道拉维尔的多队列系统。在互联网上搜索之后,我了解了多个队列,比如 php artisan queue:work -

我正在laravel中创建一个web应用程序,用户在多个游戏中进行竞价。投标由前端用户和cron job执行。Cron job在每一秒后对每一个游戏进行竞价。因此,在同一时间访问同一行时,投标之间会发生一些冲突。为了解决并发问题,我决定使用laravel队列进行投标。但我有多个游戏,因此我想同时出价的每一场比赛。我不希望同一个游戏的出价在同一时间被处理,因为这样会出现并发问题。我想知道拉维尔的多队列系统。在互联网上搜索之后,我了解了多个队列,比如

php artisan queue:work --queue=myJobQueue, myJobQueue1, myJobQueue2,..myJobQueue7

但我不确定它是如何工作的。请有人详细解释一下,所有7个队列同时或逐个工作。

正在查找
队列:listen
命令

queue:work
将处理队列驱动程序存储的所有挂起作业,而
queue:listen
将等待向其抛出作业,以便在作业到来时执行它们

如果执行php artisan queue:listen--queue=myJobQueue,myJobQueue1,myJobQueue2,…myJobQueue7,将创建7个队列并单独侦听新任务

在代码中,可以按如下方式分派作业:

dispatch((new MyJob)->onQueue('myJobQueue'));
您可能需要使用类似的工具来确保
queue:listen
始终在后台运行


希望这有帮助

php artisan queue:work--queue=myJobQueue,myJobQueue1,myJobQueue2,…myJobQueue7设置队列执行的优先级。因此,使用此选项,
myJobQueue
上的所有作业将在移动到执行
myJobQueue1
上的作业之前执行,然后按此顺序执行
myJobQueue2

但是,如果希望同时执行这些队列上的作业,可以在后台运行每个队列


php-artisan-queue:work--queue=myJobQueue&php-artisan-queue:work--queue=myJobQueue1&php-artisan-queue:work--queue=myJobQueue2&


这将在后台以单个进程的形式运行每个队列。

如Ben V所说,强烈建议使用此选项使工作进程始终处于活动状态,特别是如果您希望每个队列运行一个或多个工作进程,或者希望同时处理队列

下面是一个示例管理器配置文件:

[program:laravel-worker-myJobQueue]
process_name=%(program_name)s_%(process_num)s
command=php artisan queue:work --queue=myJobQueue
numprocs=8
autostart=true
autorestart=true

[program:laravel-worker-myJobQueue1]
process_name=%(program_name)s_%(process_num)s
command=php artisan queue:work --queue=myJobQueue1
numprocs=1
autostart=true
autorestart=true
上面的配置为
myJobQueue
创建了8个worker,为
myJobQueue1
创建了一个worker,因为多个worker可以帮助加快速度,但可能会给尝试访问数据库中同一行的作业带来麻烦,在这种情况下,您希望仅将任务限制为1个worker

然后,只需使用以下命令将作业分派到正确的队列

dispatch((new MyJob)->onQueue('myJobQueue'));


不幸的是,我使用了相同类型的主管配置,但似乎在worker1完成后,我的工作正在队列中处理。它不会同时发生。Btu我们如何配置myJobQueue和myJobQueue1,2。。。配置在哪里?
dispatch((new MyJob)->onQueue('myJobQueue1'));