批量处理大量数据集Laravel

问题描述 投票:0回答:2

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

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

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

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

更新

现在我尝试使用Laravel队列

该命令在后台运行

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

我的工作正在处理3次。我无法弄清楚为什么。

有人可以为此提出解决方案吗?

php laravel parallel-processing queue
2个回答
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次?

安装“Supervisor”后,您无需手动调度作业。它会在到达时跟踪您的工作和发送事件(如果您按照这种方式进行配置)。


0
投票

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

  1. 这些API调用是否独立?如果呼叫相互依赖,则无法进行并行处理。一个例子:假设您正在筛选页面,API调用提供上一次调用中下一页的URL,然后它们是依赖调用,除非那里有模式,否则您无法使用并行处理。
  2. 为什么作业会多次调用API?是否有替代方案(例如批量操作API)?
  3. 你在关于桌子的问题中提到过。您是否通过表格并为每条记录执行API调用?

你的工作可能被调用3次,因为他们没有超时,你已经将试验次数设置为3.如果你有一个failed_jobs表设置,请检查它以查看错误(我猜测超时)。

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

© www.soinside.com 2019 - 2024. All rights reserved.