我正在laravel中创建一个Web应用程序,用户在多个游戏中进行出价。招标正由前端用户和cron作业执行。 Cron工作每秒后对每场比赛进行投标。因此,当同时访问同一行时,出价之间会发生一些冲突。为了解决并发问题,我决定使用laravel队列进行出价。但我有多个游戏,因此我希望每个游戏同时出价。我不希望同一个游戏的出价同时进行,因为这样可能会出现并发问题。我想知道laravel中的多个队列系统。在互联网上搜索后,我了解了多个队列,如
php artisan queue:work --queue=myJobQueue, myJobQueue1, myJobQueue2,..myJobQueue7
但我不确定它是如何运作的。请有人详细解释我所有7个队列同时或逐个工作。
答案 0 :(得分:2)
就像Ben V所说的那样,强烈建议使用Supervisor来保持工作者始终处于活动状态,特别是如果您希望每个队列运行一个或多个工作者,或者希望对队列进行处理同时。
这是示例Supervisor配置文件:
[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个工作线程,为myJobQueue1
创建了一个工作线程,因为多个工作线程可以帮助加快处理速度,但可能会给尝试访问数据库中同一行的作业带来麻烦。数据库,在这种情况下,您只希望限制为1个工作人员。
您只需使用
即可将作业分配到正确的队列中dispatch((new MyJob)->onQueue('myJobQueue'));
或
dispatch((new MyJob)->onQueue('myJobQueue1'));
答案 1 :(得分:1)
正在寻找queue:listen
命令?
queue:work
将处理队列驱动程序存储的所有待处理作业,而queue:listen
将等待作业被抛出以执行它们。
如果您执行php artisan queue:listen --queue=myJobQueue, myJobQueue1, myJobQueue2,..myJobQueue7
,则会创建7个队列并自行侦听新任务。
在您的代码中,您可以调度以下作业:
dispatch((new MyJob)->onQueue('myJobQueue'));
您可能希望使用Supervisor之类的工具来确保queue:listen
始终在后台运行。
希望这有帮助!
答案 2 :(得分:0)
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 &
这会将每个队列作为单个进程在后台运行。
答案 3 :(得分:0)
这可能是旧的,但为了以防万一,所有答案都在点上,但是您必须将 .env 变量 QUEUE_CONNECTION 设置为同步以外的其他内容,如果您的配置设置为同步,它将按顺序执行每个作业进入队列(因此完成一个然后开始下一个),如果它设置为数据库或 redis,它将在需要时并行执行作业(这是设置优先级的想法),您应该查看这篇文章(它对我有帮助) ) https://medium.com/hexavara-tech/optimize-laravel-with-redis-caching-made-easy-bf486bf4c58 您还需要在 config/queue.php 中配置您的队列,例如在 'connections' 数组中:
'database' => [
'driver' => 'database',
'table' => 'jobs',
'queue' => ['default','another_queue'], //this is just 'default' by default
'retry_after' => 90,
],
这适用于此文件中的所有其他配置。
答案 4 :(得分:0)
如果您在本地机器上进行测试,您可以在您的项目中创建一个 .bat
文件并在该 bat 文件中输入这些行
start "" php artisan queue:work --queue=low
start "" php artisan queue:work --queue=low
start "" php artisan queue:work --queue=low
start "" php artisan queue:work --queue=low
start "" php artisan queue:work --queue=low
start "" php artisan queue:work --queue=low
start "" php artisan queue:work --queue=low
start "" php artisan queue:work --queue=low
start "" php artisan queue:work --queue=low
start "" php artisan queue:work --queue=low
start "" php artisan queue:work --queue=low
一行代表一次一个队列,10 表示一次运行 10 个队列。
另外,我包含了 --queue=low 因为我有一个低队列。
这仅适用于本地机器,仅供在线生产结帐主管使用。