You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 11 结合php-enqueue RabbitMQ Worker重启后批次任务无法继续执行的问题求助

Laravel 11 结合php-enqueue RabbitMQ Worker重启后批次任务无法继续执行的问题求助

大家好,我这边遇到一个挺头疼的问题,想请教下社区的各位大佬:

我们在Laravel 11系统中使用php-enqueue的RabbitMQ Worker处理批次任务。每个任务执行完成后,会检查当前批次是否需要添加新任务——如果需要就追加到批次中,不需要的话就触发批次的then/finally钩子。

为了避免Worker长时间运行引发内存泄漏等问题,我们通过自定义Service Provider给Worker配置了自动重启机制:当环境变量RABBITMQ_RESTART_AFTER_JOBS设置有效值后,每处理指定数量的任务就自动重启Worker。对应的实现代码如下:

$this->app->extend('queue.worker', function ($worker, $app) {
    $extensions = [
        new SignalExtension,
        new LoggerExtension(Log::getLogger()),
    ];

    $maxJobs = (int) config('queue.connections.rabbitmq.restart_after_jobs');
    if ($maxJobs > 0) {
        Log::info("Automatic restart after jobs provided via RABBITMQ_RESTART_AFTER_JOBS: restarting every $maxJobs jobs.");
        $extensions[] = new LimitConsumedMessagesExtension($maxJobs);
    } else {
        Log::warning('NO automatic after jobs provided via RABBITMQ_RESTART_AFTER_JOBS');
    }

    return (new Worker(
        $app['queue'],
        $app['events'],
        $app[ExceptionHandler::class],
        function () use ($app) {
            return $app->isDownForMaintenance();
        }
    ))->setExtensions($extensions);
});

但现在遇到了一个奇怪的异常场景:每当Worker触发自动重启时,经常会出现这样的情况——新任务确实被成功添加到批次中(数据库的batches表里能查到对应记录),但这个批次后续的所有任务再也不会被任何Worker处理了。

下面是我们捕获到的一段相关日志示例:

2025-08-12 07:40:36.452 new batch made 9f9d54ef-357f-4b3f-bb4a-d4b239fbc788
2025-08-12 07:40:36.561 new job added to batch 9f9d54ef-357f-4b3f-bb4a-d4b239fbc788
2025-08-12 07:40:36.563 [Job] Acknowledging message.
2025-08-12 07:40:36.564 [Queue] Pushing new job
2025-08-12 07:40:36.566 [Worker] Job result processed {"job_id":null,"result":"enqueue.already_acknowledged"}
2025-08-12 07:40:36.567 [Worker] Finished processing job.
2025-08-12 07:40:36.568 [SignalExtension] Interrupt execution

补充几个环境细节供大家参考:

  • 我们的任务是按不同队列划分执行的,不确定这个因素是否会产生影响;
  • 用Supervisor管控队列Worker,配置如下:
[supervisord]
nodaemon=true
user=root
logfile=/dev/stdout
logfile_maxbytes = 0
pidfile=/var/run/supervisord.pid

[program:core-worker]
command=/usr/local/bin/php -d variables_order=EGPCS /var/www/html/artisan queue:work --backoff=0 --max-jobs=0 --memory=256 --sleep=3 --timeout=21600 --tries=1 --rest=0
process_name=%(program_name)s_%(process_num)02d
numprocs=15
stopwaitsecs=21600
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
stderr_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
  • Laravel的RabbitMQ队列配置:
'rabbitmq' => [
    'driver' => 'interop',
    'dsn' => 'amqp+rabbitmq://' . env('RABBITMQ_USER') . ':' . env('RABBITMQ_PASSWORD') . '@' . env('RABBITMQ_HOST', 'rabbitmq') . ':' . env('RABBITMQ_PORT', 5672) . '/' . env('RABBITMQ_VHOST', '/') . '?heartbeat=' . env('RABBITMQ_HEARTBEAT', 60),
    'queue' => env('REDIS_QUEUE', env('APP_DOMAIN', 'default')),
    'restart_after_seconds' => env('RABBITMQ_RESTART_AFTER_SECONDS', 0),
    'restart_after_jobs' => env('RABBITMQ_RESTART_AFTER_JOBS', 150),
    'restart_after_memory' => env('RABBITMQ_RESTART_AFTER_MEMORY', 0),
],

我们已经尝试调大了Supervisor的stopwaitsecs参数,但问题依然存在。而且这个问题不是100%必现的,有时候Worker重启后批次任务能被其他Worker正常接着处理,有时候就不行,这也给排查增加了不少难度。

我们期望的结果是:Worker自动重启后,批次里的下一个任务能被其他空闲的Worker正常拾取并执行。请问有没有大佬遇到过类似的问题,或者能给一些排查的方向?感谢大家的帮助!

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 07:40:29