【问题标题】:Batch or Chain for jobs inside jobs作业内作业的批处理或链式作业
【发布时间】:2021-01-02 04:35:45
【问题描述】:

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

【问题讨论】:

    标签: laravel jobs laravel-8


    【解决方案1】:

    Laravel 的作业批处理功能让您可以轻松地执行一批作业,然后在这批作业执行完毕后执行一些操作。

    如果您在使用 Jobs Batching 时遇到内存不足问题,则说明您做错了。由于队列是一个一个地执行的,如果你以这种方式配置它应该没有问题,即使它们超过 100k 条记录。因此,请确保为每个项目粘合一个 Job,并执行该操作,这样不会有问题。

    那么,你可以做这样的事情。

    $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();
    

    【讨论】:

    • then 方法中调用新的、不同的清理作业是否有问题?
    • 理论上应该没有问题,但最合乎逻辑的做法是将这些链接在同一个链中。
    • 好的,谢谢。我说的是最终作业,需要在初始批处理期间在作业中设置数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 2018-02-19
    • 1970-01-01
    相关资源
    最近更新 更多