Laravel 佇列重複執行同一個任務

xingkong12138發表於2020-03-04

我在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 的值,這是為了確保佇列程式總在任務重試以前關閉。如果 --timeoutretry_after 大,那麼你的任務可能被執行兩次。

然後我就去檢查了我的引數設定,我的--timeout為500,而retry_after才90,怪不得會重複執行

本作品採用《CC 協議》,轉載必須註明作者和本文連結
我的部落格:www.zhangkaixing.com

相關文章