我目前在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次。我无法弄清楚为什么。
有人可以为此提出解决方案吗?
要运行并行作业,您需要安装一个管理器,如“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次?
安装“Supervisor”后,您无需手动调度作业。它会在到达时跟踪您的工作和发送事件(如果您按照这种方式进行配置)。
在我们提出最佳解决方案之前,您必须回答几个关键问题:
你的工作可能被调用3次,因为他们没有超时,你已经将试验次数设置为3.如果你有一个failed_jobs
表设置,请检查它以查看错误(我猜测超时)。
这些问题有几种解决方案。队列,流程工作者,组合等是可能的解决方案,但每个人都必须谨慎处理。更好的方法是最小化API调用(如果可能)。一旦您回复,将更新答案。