記一次 Redis 的事務引起的訊息佇列報錯

一位不願意透露姓名的楊先生發表於2020-06-25

今天后臺看到訊息佇列停了,上伺服器看訊息佇列程式還在執行,檢視日誌後發現下面的報錯

local.ERROR: Cannot use object of type Predis\Response\Status as array {"exception":"[object] (Symfony\\Component\\Debug\\Exception\\FatalThrowableError(code: 0): Cannot use object of type Predis\\Response\\Status as array at /home/web/superAdminAPI/vendor/laravel/framework/src/Illuminate/Queue/RedisQueue.php:230)

在predis的提問中發現是redis事務的問題
相關連結github.com/nrk/predis/issues/459

追蹤後臺程式碼,發現有一塊程式碼在異常捕獲中沒有取消redis事務

修改後

    /**
     * 訂單取消
     * Create by Peter
     */
    function order_cancel($user_id,$order_id){

        try {

            \DB::beginTransaction();

            Redis::multi();

            //業務

            if(!$order_info) throw new \Exception('該訂單不可取消');


            \DB::commit();

            Redis::exec();

        } catch (Exception $exception) {

            \Log::debug($exception->getMessage());

            Redis::discard();

            \DB::rollBack();

        }
    }

搞不清楚為什麼不取消事務會導致訊息佇列停止,有誰遇到過的嗎?

推薦一下管理程式的工具
程式管理

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章