【问题标题】:Batch processing of large number of data set Laravel批量处理大量数据集 Laravel
【发布时间】:2018-12-08 16:00:35
【问题描述】:

我目前在 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 次。我不知道为什么。

有人可以在这里提出解决方案吗?

【问题讨论】:

  • 调用一个 API 80 次?
  • 你使用的是哪个版本的 laravel ?你能解释一下为什么每五分钟调用一次太多的 API 吗?
  • 作业运行了 3 次,这是因为作业失败。失败的作业将(默认情况下)运行 3 次。您能否验证作业是否失败(通过查看 queue:work 的输出)?

标签: php laravel parallel-processing queue


【解决方案1】:

要运行并行作业,您需要安装一个管理器,例如“主管”,它将为您提供各种工作器(实例)。您可以设置尽可能多的工作人员,因为您的服务器资源可以处理。

请记住,每个 worker 都是 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 次?

安装“主管”后,您无需手动分派作业。它会跟踪您的工作并在它们到达后立即调度它们(如果您以这种方式配置它们)。

【讨论】:

    【解决方案2】:

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

    1. 这些 API 调用是独立的吗?如果调用相互依赖,则无法进行并行处理。举个例子:假设您正在筛选页面,并且 API 调用在上一个调用中提供了下一页的 URL,那么它们是依赖调用,除非其中存在模式,否则您不能使用并行处理。

    2. 为什么作业调用 API 这么多次?是否有替代方案(例如批量操作 API)?

    3. 您在问题中提到了一张桌子。您是否遍历表并为每条记录执行 API 调用?

    您的作业可能会被调用 3 次,因为它们因超时而失败,并且您已将试验次数设置为 3。如果您有 failed_jobs 表设置,请检查它以查看错误(I' m 猜测超时)。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-30
      • 2011-08-03
      • 1970-01-01
      • 2017-02-09
      相关资源
      最近更新 更多