laravel - 作业内作业的批处理或链接
问题描述
我有工作 A,它下载 xml,然后调用其他工作 B,它将在数据库上创建数据。此作业 B 将被循环调用,并且可以超过 10.000 个项目。首先尝试使用链式方法,但问题是,如果有人以错误的顺序调用队列,它将不起作用。然后尝试使用新 Laravel 8 中的批处理。将所有作业(超过 10000 个)收集到一个批处理可能会导致内存不足异常。另一个问题是最后调用作业 C。此作业将更新一些凭据。这就是为什么作业 A 和 B 必须成功运行的原因。对于这种情况可能有什么好主意吗?
解决方案
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();
推荐阅读
- next.js - 在 Next Js 中使用全局自定义样式表
- amazon-web-services - 当 SSH 密钥出错时,有没有办法恢复对 EC2 实例的访问?
- java - 修复 java 可调用存储过程以使用 spring 数据源属性
- python - 从 Python 优化 Impala 数据加载的建议
- sql - 将 varchar($22.45) 转换为十进制值(22.45)
- android - 是否有可能在工具栏下方的 android 上设置 0,0 坐标或使工具栏不可重叠?
- java - Mongo 存储库 findByDateBefore 不返回结果
- javascript - npm 错误!cb() 从未调用过!进行 npm 安装时
- php - 子类实例化问题——为什么不能使用子类实例来执行父类方法
- python - 如何在 python 中获取字符串的值(True 或 False)?