我在laravel中使用佇列執行任務,任務的邏輯大體是迴圈插入資料(這裡我就要說一下了,迴圈裡面最好不要執行插入/修改
操作)。
這是大體程式碼:
$data=array(這是資料);
foreach ($data as $key => $value) {
//這裡是判斷資料是否已存在
//code....
$table1 = new Table1;
$table1->field1=$value['field1'];
$table1->field2=$value['field2'];
if($table1->save()){
$table2 = new Table2;
$table2->table1_id=$table1->id;
$table2->field1=$value['field3'];
$table2->field2=$value['field4'];
$table2->save();
}
}
但是我發現插入到資料庫裡的資料有大量重複的資料。(註釋:我用的redis驅動佇列)
我檢視佇列執行日誌,發現是因為我任務的執行時間太長,導致任務過期,重新把任務放到佇列裡面,然後問題就出來了,我超時的任務並沒有停止掉,而我新放到佇列裡的任務也在執行,這就導致有兩個佇列在同時執行一個任務。
我檢視了文件發現,有這麼一個東西:
注:引數項
--timeout
的值應該始終小於配置項retry_after
的值,這是為了確保佇列程式總在任務重試以前關閉。如果--timeout
比retry_after
大,那麼你的任務可能被執行兩次。
然後我就去檢查了我的引數設定,我的--timeout
為500,而retry_after
才90,怪不得會重複執行
本作品採用《CC 協議》,轉載必須註明作者和本文連結
我的部落格:www.zhangkaixing.com