php Laravel批量处理大量数据集

06odsfpq  于 11个月前  发布在  PHP
关注(0)|答案(2)|浏览(152)

我目前在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

字符串
这个方法太慢了,如果表中有1000000条记录,那么处理它需要很多次。我之前使用了一个1000的块,它会破坏我的系统,说“打开的文件太多”异常,我已经将块从1000减少到80。
我知道这是一个非常糟糕的设计我在做什么。
我需要重新架构目前的模型,并建立一些可以并行处理。至少500-1000并行处理的数据。
我如何在Laravel中做到这一点。它甚至可以通过PHP或我必须看一个选项,如nodejs?请帮助我,如果它可以使用队列。即使我使用队列,我将能够通过它做并行处理?

更新

现在我尝试使用Laravel队列
在后台运行的命令

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


我的工作被处理了三次。我不知道为什么。
有没有人能给我一个解决办法?

bkkx9g8r

bkkx9g8r1#

要运行并行作业,您需要安装一个管理器,如“Supervisor”,它将为您提供各种工作器(示例)。您可以设置尽可能多的工作器,因为您的服务器资源可以处理。
请记住,每个worker都是laravel应用程序的一个不同示例,反映了它创建时的状态。如果你修改了相关代码,比如作业的代码,你需要重新启动supervisor,这样它才能得到更新的版本。
主管
接下来,您必须为每个分派的作业设置一种方法,以要求正确的可用块。
作业1将获得块1到80。作业2将获得块81到160。...
您还没有详细说明代码,这可能不是问题,但如果是这样,您可以创建一个数据库表来跟踪可用的块和尚未处理的块。
关于你的工作被解雇三次,下面的代码:

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

字符串
它的功能是调度已经在队列中的作业。也许另一段代码正在排队作业3次?
安装“Supervisor”后,您将不需要手动调度作业。它将跟踪您的作业,并在作业到达时立即调度(如果您这样配置的话)。

nzk0hqpo

nzk0hqpo2#

在我们提出最佳解决方案之前,您必须回答以下几个关键问题:
1.这些API调用是独立的吗?如果调用相互依赖,那么并行处理是不可能的。举个例子:假设你正在筛选页面,API调用在前一个调用中提供了下一个页面的URL,那么它们是依赖调用,除非其中有一个模式,否则你不能使用并行处理。
1.为什么作业调用API这么多次?是否有替代方法(如批量操作API)?
1.你在问题中提到了一个表。你是否遍历一个表并为每个记录执行一个API调用?
你的作业可能被调用了3次,因为它们因超时而失败,而你已经将试验次数设置为3次。如果你有一个failed_jobs表设置,请检查它以查看错误(我猜是超时)。
这些问题有几种解决方案。代理人,流程工人,组合等都是可能的解决方案,但每一个都必须谨慎处理。更好的方法是尽量减少API调用(如果可能的话)。一旦您响应,将更新答案。

相关问题