我目前在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次。我不知道为什么。
有人可以为此建议解决方案吗?
答案 0 :(得分:1)
要运行并行作业,您将需要安装一个管理器,例如“ Supervisor”,它将为您提供各种工作人员(实例)。您可以设置尽可能多的工作服务器资源。
请记住,每个工作程序都是laravel应用程序的不同实例,反映了它在创建时的状态。如果您对相关代码(例如作业代码)进行了更改,则需要重新启动主管,以便它可以获取较新的版本。
接下来,您必须为分配的每个作业设置一种方法,以要求正确的可用块。
作业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)
在我们提出最佳解决方案之前,您必须回答几个关键问题:
这些API调用是否独立?如果调用相互依赖,则无法进行并行处理。一个例子:假设您正在浏览页面,并且API调用提供了上一个调用中下一页的URL,那么它们就是从属调用,除非其中有某种模式,否则您将无法使用并行处理。
为什么作业要调用API这么多次?是否有其他选择(例如批量操作API)?
您在有关表的问题中提到过。您是否要遍历表格并为每个记录执行API调用?
您的作业可能因超时而失败,因此可能被调用3次,并且您已将尝试次数设置为3。如果您设置了failed_jobs
表,请检查该表以查看错误(我猜是超时)。
有几种解决这些问题的方法。队列,流程工作者,组合等都是可能的解决方案,但每个方案都必须谨慎对待。更好的方法是最小化API调用(如果可能)。回答后将更新答案。