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