failed_jobs表中为何会有uuid这个字段?任务失败是如何将失败信息添加到failed_jobs表中的

failed_jobs表中为何会有uuid这个字段?任务失败是如何将失败信息添加到failed_jobs表中的
failed_jobs表中为何会有uuid这个字段?任务失败是如何将失败信息添加到failed_jobs表中的

failed_jobs表中为何会有uuid这个字段?任务失败是如何将失败信息添加到failed_jobs表中的

laravel版本6.x系列
求解答?

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

Laravel 6 中的 failed_jobs 表没有 uuid 字段,这是因为在 Laravel 6 中,Laravel 使用的队列管理器 illuminate/queue 组件的版本升级到了 v5.7 以后,该组件的存储失败任务的方式发生了变化。

在之前的版本中,Laravel 使用的是数据库中的 jobs 表来存储任务,其中包含一个 uuid 字段用于标识每个任务的唯一标识符。但是,在 Laravel 5.7 版本以后,Laravel 开始使用一个独立的 failed_jobs 表来存储失败任务的信息,而该表没有 uuid 字段。

这样设计的原因可能是为了简化 failed_jobs 表的结构,避免出现不必要的冗余字段。另外,使用自增长的主键作为唯一标识符也能够满足标识每个失败任务的需求,不必再引入额外的 UUID 字段。

在 Laravel 7 后,failed_jobs 表重新加入了 uuid 字段,这是因为 Laravel 开发团队考虑到一些情况下使用自增长的主键可能会带来一些问题,比如:

1.在某些情况下,由于数据表中的自增 ID 超过了最大值,导致无法插入新的记录。

2.在分布式系统中,多个节点同时写入失败任务到数据库时,可能会导致 ID 冲突的问题。

因此,在 Laravel 7 中,Laravel 开发团队决定将 failed_jobs 表重新加入 uuid 字段,以提供一种更可靠的方式来标识每个失败任务。

1年前 评论
蜗牛啊蜗牛 (楼主) 1年前
讨论数量: 16

为什么会有uuid这个字段是什么意思? 任务失败是如何添加到数据库的可以查看源码,论坛里有过很多源码解析。如https://learnku.com/articles/7037/laravel-queue-analysis-of-message-queue-tasks-and-distribution-source-code。

file 服务提供者的注册函数里也能找到插入的过程

1年前 评论
蜗牛啊蜗牛 (楼主) 1年前
蜗牛啊蜗牛 (楼主) 1年前

任务执行抛出异常且超过重试次数的时候,Laravel 就会捕获异常并插入 failed_jobs 表。此时 Laravel 会自动生成一个唯一的uuid,为了确保同一任务失败时不会创建多个失败记录。

1年前 评论
蜗牛啊蜗牛 (楼主) 1年前
蜗牛啊蜗牛 (楼主) 1年前
蜗牛啊蜗牛 (楼主) 1年前
kkokk (作者) 1年前
kkokk (作者) 1年前
蜗牛啊蜗牛 (楼主) 1年前
蜗牛啊蜗牛 (楼主) 1年前
kkokk (作者) 1年前

任务队列失败时会将失败的任务信息记录到 failed_jobs 数据表中。failed_jobs 表中的 uuid 字段是由系统自动生成的唯一标识符,用于标识每个失败的任务。

要将失败的队列数据添加到 failed_jobs 中,可以使用 Laravel 提供的 failed 队列驱动。在 config/queue.php 配置文件中,将 failed 队列驱动的 driver 改为 database,然后运行以下命令:

php artisan queue:failed-table
php artisan migrate

这将会为你创建一个名为 failed_jobs 的数据表,用于存储失败的队列任务信息。当队列任务执行失败时,系统会自动将失败的任务信息写入到 failed_jobs 数据表中。

如果你想手动将一个失败的队列任务添加到 failed_jobs 中,可以使用以下代码:

use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;

try {
    // 执行队列任务
} catch (\Exception $e) {
    // 记录失败任务信息
    $payload = json_encode($job->payload());
    $exception = $e->getMessage();
    Log::error("Failed to execute queue job: $payload. Exception: $exception");

    // 将失败任务信息写入到 failed_jobs 表中
    DB::table('failed_jobs')->insert([
        'connection' => $job->getConnectionName(),
        'queue' => $job->getQueue(),
        'payload' => $payload,
        'exception' => $exception,
        'failed_at' => now(),
    ]);
}

这段代码将在队列任务执行失败时将失败任务信息记录到日志中,并将其写入到 failed_jobs 表中。

1年前 评论

Laravel 6 中的 failed_jobs 表没有 uuid 字段,这是因为在 Laravel 6 中,Laravel 使用的队列管理器 illuminate/queue 组件的版本升级到了 v5.7 以后,该组件的存储失败任务的方式发生了变化。

在之前的版本中,Laravel 使用的是数据库中的 jobs 表来存储任务,其中包含一个 uuid 字段用于标识每个任务的唯一标识符。但是,在 Laravel 5.7 版本以后,Laravel 开始使用一个独立的 failed_jobs 表来存储失败任务的信息,而该表没有 uuid 字段。

这样设计的原因可能是为了简化 failed_jobs 表的结构,避免出现不必要的冗余字段。另外,使用自增长的主键作为唯一标识符也能够满足标识每个失败任务的需求,不必再引入额外的 UUID 字段。

在 Laravel 7 后,failed_jobs 表重新加入了 uuid 字段,这是因为 Laravel 开发团队考虑到一些情况下使用自增长的主键可能会带来一些问题,比如:

1.在某些情况下,由于数据表中的自增 ID 超过了最大值,导致无法插入新的记录。

2.在分布式系统中,多个节点同时写入失败任务到数据库时,可能会导致 ID 冲突的问题。

因此,在 Laravel 7 中,Laravel 开发团队决定将 failed_jobs 表重新加入 uuid 字段,以提供一种更可靠的方式来标识每个失败任务。

1年前 评论
蜗牛啊蜗牛 (楼主) 1年前

需要先自定义服务提供者如:

use Illuminate\Support\Facades\DB;
use Ramsey\Uuid\Uuid;
user Illuminate\Queue\Failed\DatabaseFailedJobProvider;
class UUIDDatabaseFailedJobProvider extends DatabaseFailedJobProvider
{
      /**
     * Log a failed job into storage.
     *
     * @param  string  $connection
     * @param  string  $queue
     * @param  string  $payload
     * @param  \Exception  $exception
     * @return int|null
     */
    public function log($connection, $queue, $payload, $exception)
    {
        $failed_at = Date::now();

        $exception = (string) $exception;

        $uuid = Uuid::uuid4()->toString();

        return $this->getTable()->insertGetId(compact(
            'connection', 'uuid', 'queue', 'payload', 'exception', 'failed_at'
        ));
    }

然后定义一个新的QueueServiceProvider 继承重写框架的QueueServiceProvider服务提供者>具体代码,重写registerFailedJobServices方法,具体修改方式可以抄袭一下laravel8 registerFailedJobServices方法的写法>具体代码

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!