説明
現在、大量のデータをアップロードして処理するキューが並んでいます。レコードがすでに存在するかどうかをチェックする必要があるため、この設定は非常に面倒です.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ジョブは、データベースにそれらを実行し、保存するまで、これらのレコードはどこにも保存されないので、それはこれらを実行するのに要する時間上の任意の影響を与える可能性がありますか?すべてのレコードを一時的に別のテーブルに保存し、後で実際のレコードに移行することが賢明でしょうか?