Php 大量数据集的批处理Laravel
我目前在laravel中有一个Cron,它以块的形式获取数据并调用API 流量如下所示Php 大量数据集的批处理Laravel,php,laravel,parallel-processing,queue,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块,这破坏了我的系统,
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
我知道这是我正在做的一个非常糟糕的设计
我需要重新构建当前模型,并构建能够并行处理的东西。至少500-1000并行处理数据
在拉威尔我该怎么做。甚至可以通过PHP实现吗?或者我必须考虑像nodejs这样的选项吗?如果可以使用队列,请帮助我。即使我使用队列,我也能通过它进行并行处理吗
更新
现在我尝试使用Laravel队列
在后台运行的命令
php /Users/ajeesh/PhpstormProjects/untitled3/open-backend-v2/artisan queue:work database --tries=1 --timeout=56
我的工作被处理了三次。我不明白为什么
有人能在此提出解决方案吗?要运行并行作业,您需要安装一个管理器,如“Supervisor”,它将为您提供各种工作人员(实例)。您可以设置服务器资源所能处理的工作人员数量 请记住,每个worker都是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次
安装“Supervisor”后,无需手动分派作业。它将跟踪您的作业,并在作业到达时立即发送(如果您以这种方式配置它们)。在我们找到最佳解决方案之前,您必须回答几个关键问题:
失败的\u作业
表设置,请检查它以查看错误(我猜是超时)
有几种解决这些问题的方法。队列、流程工人、组合等都是可能的解决方案,但必须谨慎处理。更好的方法是最小化API调用(如果可能)。响应后将更新答案。调用API 80次?您使用的是哪个版本的laravel?你能解释一下为什么每五分钟调用太多API吗?作业运行了3次,这是因为作业失败了。失败的作业(默认情况下)将运行3次。您能否验证作业是否失败(通过查看queue:work的输出)?