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

Batch or Chain for jobs inside jobs

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

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 with all his items.
];

Bus::batch($chain)->then(function (Batch $batch) {
    // All jobs completed successfully...
    // Uupdate some credentials...
})->catch(function (Batch $batch, Throwable $e) {
    // First batch job failure detected...
})->finally(function (Batch $batch) {
    // The batch has finished executing...
})->dispatch();