Laravel中的多个队列

时间:2018-05-29 04:58:04

标签: php laravel queue

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

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

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

5 个答案:

答案 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 因为我有一个低队列。

这仅适用于本地机器,仅供在线生产结帐主管使用。