Laravel Horizo​​n 队列一直暂停一分钟

Ada*_*utt 5 queue supervisord laravel pusher

TL; DR Laravel Horizo​​n 队列工作人员在处理每个作业后进入睡眠状态 60 秒

我的 Laravel Horizo​​n 队列中有大量积压。有很多工作人员(maxProcesses 设置为 30),但是当我监视日志文件时,输出表明它在 2-3 秒的过程中正好处理了 30 个作业,然后它暂停了整整一分钟(更多或不到 60 秒)。

任何想法为什么会发生这种情况?我是否达到了导致 Horizo​​n 或 Supervisor 中断的资源限制?

这是我的 horizo​​n.php 配置文件中的相关部分:

'environments' => [
        'production' => [
            'supervisor-1' => [
                'connection' => 'redis',
                'queue' => ['high', 'default', 'low'],
                'balance' => 'false',
                'minProcesses' => 3,
                'maxProcesses' => 30,
                'timeout' => 1800,
                'tries' => 3
            ],
Run Code Online (Sandbox Code Playgroud)

我在本地环境中有完全相同的配置,本地吞吐量约为 600 个作业/分钟。在生产中,它徘徊在大约 30 个工作/分钟左右。

根据@Qumber 的请求更新

在大多数情况下,这些实际上并不是工作。它们是由一个或多个侦听器处理的事件,其中大部分都非常简单。例如:


public function handle(TransactionDeleted $event)
{
    TransactionFile::where("transaction_id", $event->subject->id)->delete();
}

Run Code Online (Sandbox Code Playgroud)

这是一些队列配置:

'redis' => [
    'driver' => 'redis',
    'connection' => 'default',
    'queue' => env('REDIS_QUEUE', 'default'),
    'retry_after' => 1900,
    'block_for' => null,
],
Run Code Online (Sandbox Code Playgroud)

根据@sykez 请求更新

这是本地的主管配置:

[program:laravelqueue]
process_name=%(program_name)s_%(process_num)02d
command=php /path/to/artisan queue:once redis --sleep=1 --tries=1

autostart=true
autorestart=true
user=adam
numprocs=3
redirect_stderr=true
stdout_logfile=/path/to/worker.log
stopwaitsecs=3600
Run Code Online (Sandbox Code Playgroud)

这是生产中的主管配置:

[program:daemon-XXXXXX]
directory=/home/forge/SITE_URL/current/
command=php artisan horizon

process_name=%(program_name)s_%(process_num)02d
autostart=true
autorestart=true
user=forge
redirect_stderr=true
stdout_logfile=/home/forge/.forge/daemon-XXXXXX.log
stopwaitsecs=3600
Run Code Online (Sandbox Code Playgroud)

本地主管直接运行队列,带有“once”标志,它应该为每个作业加载整个代码库,而不是作为守护进程运行。当然,这应该使它变慢,而不是快 20 倍......

另一个更新 感谢 Laravel 核心开发人员之一的帮助,我们能够确定所有“挂起”的作业都是广播作业,从配置为在触发后广播的事件。我们使用 Pusher 作为我们的广播引擎。当 Pusher 被禁用时(就像在我们的本地环境中一样),作业会立即完成而不会暂停。

小智 0

我遇到了同样的问题,队列在开始下一个作业之前突然等待一分钟,即使是在多个线程上,但对我来说,触发它的作业之间几乎没有相关性(而且通常是相同的作业,但并不总是如此) )。

我最终通过将 config/horizo​​n.php 中的内存限制从 64 增加到 128mb 解决了这个问题:

'defaults' => [
    'supervisor-1' => [
        'memory' => 128,
    ],
],

Run Code Online (Sandbox Code Playgroud)

此设置在 Horizo​​n v5 中的某个时候被添加到默认配置中,大小为 128MB,但在我正在使用的系统上,它已经设置为 64MB,导致此问题最终出现。