Aje*_*esh 1 php queue parallel-processing laravel
我目前在 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
Run Code Online (Sandbox Code Playgroud)
此方法非常慢,如果表中有 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
Run Code Online (Sandbox Code Playgroud)
我的作业被处理了 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
Run Code Online (Sandbox Code Playgroud)
它的功能是调度已经在队列中的作业。也许另一段代码正在将作业排队 3 次?
安装“Supervisor”后,您无需手动调度作业。它将跟踪您的作业并在它们到达时立即调度它们(如果您以这种方式配置它们)。
| 归档时间: |
|
| 查看次数: |
4757 次 |
| 最近记录: |