laravel队列中

时间:2017-07-11 15:07:10

标签: php mysql laravel

解释

我目前有一组队列排队上传和处理大量数据。这个设置非常繁琐,因为我必须检查记录是否已经存在,并且由于我在10k记录的远端上传,我必须减少每个队列必须处理的记录数量。

我已经设置了一个队列来处理数据并将其分成每个500个记录的位,然后我将这些块传递给它自己的单独队列,该队列检查每个记录是否存在然后继续上传它到数据库。

我已经设置了一个监听器来检查这个确切过程需要多长时间,这就是问题发生的地方。

在我的CLI中运行php artisan queue:listen --memory=1024 --timeout=100可让前几个队列大约需要5-10秒。然后它们以指数方式开始及时增加。

This batch took: 29.013844013214 Seconds to process
This batch took: 28.680887937546 Seconds to process 
This batch took: 28.172641992569 Seconds to process 
This batch took: 27.722810983658 Seconds to process 
This batch took: 20.302350997925 Seconds to process
This batch took: 16.653347969055 Seconds to process 
This batch took: 16.353777885437 Seconds to process
This batch took: 15.923125982285 Seconds to process 
This batch took: 15.426895856857 Seconds to process
This batch took: 15.151268005371 Seconds to process

这可以持续到100多秒,然后再次随机重置5-10秒。

这是我用来处理记录的代码。

       foreach ($data as $record) {
            $batch_id = $record['batch_id'];
            unset($record['batch_id']);
            if (is_null(Record::where($record)->first())) {
                $record['batch_id'] = $batch_id;
                $upload[] = $record;
            } else {
                $duplicatechunks++;
            }
        }
        if (!empty($upload)) {
            DB::table('records')->insert($upload);
        }

此代码删除值Batch_id,因为它是唯一的,因此我无法在搜索现有记录时使用它。该代码还跟踪$duplicatechunks值,这只是一种了解之前是否已上传该记录的方法。 $duplicatechunks上传到$batch我也在跟踪此队列。在代码的开头,它从$duplicatechunks = $batch->chunks_duplicate设置,然后在数据库插入下方$batch->chunks_duplicate = $duplicatechunks保存它。

到目前为止我尝试了什么

  • 我尝试过处理插入记录更多处理能力的过程,但这只能工作一分钟左右。
  • 我还尝试编辑代码,分别上传每条记录以批量上传。这加快了一般时间,从19秒减少到每个队列5个。

重要

  • 队列处理程序是数据库,使用内置的laravel作业表

有没有人遇到类似的队列问题?

编辑:

由于在InsertRecords作业执行并将它们存储在数据库中之前,这些记录不会保存在任何地方,这会对这些执行时间产生影响吗?将所有记录临时存储在不同的表中,然后将它们迁移到实际的记录中会更明智吗?

1 个答案:

答案 0 :(得分:0)

每个队列都有expire时间可以配置。我不知道每个作业是否可以配置这个,但是可以配置为你最长工作的最长到期时间。