我目前有一组队列排队上传和处理大量数据。这个设置非常繁琐,因为我必须检查记录是否已经存在,并且由于我在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
保存它。
有没有人遇到类似的队列问题?
由于在InsertRecords作业执行并将它们存储在数据库中之前,这些记录不会保存在任何地方,这会对这些执行时间产生影响吗?将所有记录临时存储在不同的表中,然后将它们迁移到实际的记录中会更明智吗?
答案 0 :(得分:0)
每个队列都有expire
时间可以配置。我不知道每个作业是否可以配置这个,但是可以配置为你最长工作的最长到期时间。