作业内作业的批处理或链式

问题描述 投票:0回答:1

我有一个作业 A,它下载 xml,然后调用其他作业 B,它将在数据库上创建数据。该作业 B 将在循环中调用,并且可以超过 10,000 个项目。首先尝试使用链式方法,但问题是,如果有人以错误的顺序调用队列,它将无法工作。然后尝试使用新的 Laravel 8 中的批处理。将所有作业(超过 10000 个)收集到一个批处理可能会导致内存不足异常。另一个问题是最后调用作业 C。此作业将更新一些凭据。这就是为什么作业 A 和 B 必须成功运行。对于这种情况可能有什么好主意吗?

laravel jobs laravel-8
1个回答
4
投票

Laravel 的作业批处理功能允许您轻松执行一批作业,然后在该批作业执行完成后执行某些操作。

如果您的作业批处理遇到内存不足问题,那么您就做错了。由于队列是一一执行的,如果您以这种方式配置的话,应该不会有任何问题,即使它们超过 100k 条记录。因此,请确保为每个项目粘合一个作业,并执行该操作,这样就不会有问题。

然后,你可以做这样的事情。

    $chain = [
        new ProcessPodcast(Podcast::find(1)),
        new ProcessPodcast(Podcast::find(2)),
        new ProcessPodcast(Podcast::find(3)),
        new ProcessPodcast(Podcast::find(4)),
        new ProcessPodcast(Podcast::find(5)),
        ...
        // And so on for all your items.
        // This should be generated by a foreach that iterates through all items
    ];

    Bus::batch($chain)->then(function (Batch $batch) {
        // All jobs completed successfully...
        // Update some credentials...
    })->catch(function (Batch $batch, Throwable $e) {
        // First batch job failure detected...
    })->finally(function (Batch $batch) {
        // The batch has finished executing...
    })->dispatch();
© www.soinside.com 2019 - 2024. All rights reserved.