批处理大量数据集Laravel

时间:2018-12-08 16:00:36

标签: php laravel parallel-processing queue

我目前在laravel中有一个Cron,它可以分块地获取数据并调用API。

流程在下面

1. Cron runs every 5 minutes
2. Takes 80 data in chunks
3. Loop it through and call an API for 80 times and takes the next 80 in the next cron cycle

此方法非常慢,以至于如果表中有10000000条记录,它将花费很多时间来处理它。我以前使用过1000的块,这打破了我的系统所说的“打开的文件太多”的异常,为此我将其从1000减少到80。

我知道这是我所做的非常糟糕的设计。

我需要重新构建当前模型并构建可以并行处理的东西。 Atleast 500-1000数据并行处理。

我该如何在Laravel中做到这一点。甚至有可能通过PHP来实现,还是我必须查看诸如nodejs之类的选项?如果可以使用队列,请帮助我。即使我使用队列,我也可以通过它进行并行处理吗?

更新

现在我已经尝试使用Laravel队列

在后台运行的命令

php /Users/ajeesh/PhpstormProjects/untitled3/open-backend-v2/artisan queue:work database --tries=1 --timeout=56

我的工作正在处理3次。我不知道为什么。

有人可以为此建议解决方案吗?

2 个答案:

答案 0 :(得分:1)

要运行并行作业,您将需要安装一个管理器,例如“ Supervisor”,它将为您提供各种工作人员(实例)。您可以设置尽可能多的工作服务器资源。

请记住,每个工作程序都是laravel应用程序的不同实例,反映了它在创建时的状态。如果您对相关代码(例如作业代码)进行了更改,则需要重新启动主管,以便它可以获取较新的版本。

Supervisor

接下来,您必须为分配的每个作业设置一种方法,以要求正确的可用块。

作业1将获得1到80的区块。 作业2将获得块81到160。 ...

您尚未详细说明代码,也许这不会有问题,但是如果是这样,则可以创建数据库表来跟踪可用的块和尚未处理的块。

关于您的工作被解雇了3次,代码如下:

php /Users/ajeesh/PhpstormProjects/untitled3/open-backend-v2/artisan queue:work database --tries=1 --timeout=56

它的功能是分派队列中已有的作业。也许另一段代码正在排队3次?

安装“主管”后,您将无需手动调度作业。它将跟踪您的工作,并在工作到达时立即将其分发(如果您以这种方式配置的话)。

答案 1 :(得分:0)

在我们提出最佳解决方案之前,您必须回答几个关键问题:

  1. 这些API调用是否独立?如果调用相互依赖,则无法进行并行处理。一个例子:假设您正在浏览页面,并且API调用提供了上一个调用中下一页的URL,那么它们就是从属调用,除非其中有某种模式,否则您将无法使用并行处理。

  2. 为什么作业要调用API这么多次?是否有其他选择(例如批量操作API)?

  3. 您在有关表的问题中提到过。您是否要遍历表格并为每个记录执行API调用?

您的作业可能因超时而失败,因此可能被调用3次,并且您已将尝试次数设置为3。如果您设置了failed_jobs表,请检查该表以查看错误(我猜是超时)。

有几种解决这些问题的方法。队列,流程工作者,组合等都是可能的解决方案,但每个方案都必须谨慎对待。更好的方法是最小化API调用(如果可能)。回答后将更新答案。