violetshih/laravel-mongo-queue-monitor

Laravel MongoDb 作业队列的队列监控

1.0.0 2023-10-23 13:39 UTC

This package is auto-updated.

Last update: 2024-09-23 15:51:17 UTC


README

本软件包提供类似于 Laravel Horizon 的监控功能,用于MongoDB数据库队列。

本软件包是基于 romanzipp 的 laravel-queue-monitor 的分支。

本软件包需要 Jenssegers 的 laravel-mongodb

功能

  • 监控任何队列的作业,如 Laravel Horizon
  • 处理失败的作业并存储异常
  • 监控作业进度
  • 获取作业剩余时间的估计
  • 为作业监控存储附加数据

安装

composer require violetshih/laravel-mongo-queue-monitor

配置

将配置和迁移文件复制到您的项目中

php artisan vendor:publish --provider="violetshih\MongoQueueMonitor\Providers\MongoQueueMonitorProvider"

迁移队列监控表。表名可以在配置文件或通过发布的迁移中进行配置。

php artisan migrate

使用方法

要监控一个作业,只需将 violetshih\MongoQueueMonitor\Traits\IsMonitored 特性添加到作业类中。

use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use violetshih\MongoQueueMonitor\Traits\IsMonitored; // <---

class ExampleJob implements ShouldQueue
{
    use Dispatchable;
    use InteractsWithQueue;
    use Queueable;
    use SerializesModels;
    use IsMonitored; // <---
}

重要! 您需要在作业类中实现 Illuminate\Contracts\Queue\ShouldQueue 接口。否则,Laravel 不会调度任何包含状态信息的事件,用于监控作业。

用户界面

您可以通过在路由文件中调用 Route::queueMonitor() 来启用可选的用户界面路由,类似于官方的 ui 架构

Route::prefix('jobs')->group(function () {
    Route::queueMonitor();
});

路由

有关更多信息,请参阅 完整配置文件

Preview

扩展使用方法

进度

您可以设置一个 进度值(0-100),以获取作业进度的估计。

use Illuminate\Contracts\Queue\ShouldQueue;
use violetshih\MongoQueueMonitor\Traits\IsMonitored;

class ExampleJob implements ShouldQueue
{
    use IsMonitored;

    public function handle()
    {
        $this->queueProgress(0);

        // Do something...

        $this->queueProgress(50);

        // Do something...

        $this->queueProgress(100);
    }
}

分块进度

作业的一个常见场景是迭代处理大量集合。

此示例作业通过每个块迭代循环处理大量用户并更新其进度值。

use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Database\Eloquent\Collection;
use violetshih\MongoQueueMonitor\Traits\IsMonitored;

class ChunkJob implements ShouldQueue
{
    use IsMonitored;

    public function handle()
    {
        $usersCount = User::count();

        $perChunk = 50;

        User::query()
            ->chunk($perChunk, function (Collection $users) use ($perChunk, $usersCount) {

                $this->queueProgressChunk($usersCount‚ $perChunk);

                foreach ($users as $user) {
                    // ...
                }
            });
    }
}

进度冷却

为了避免因快速重复的更新查询而使数据库过载,您可以通过覆盖 progressCooldown 方法并指定秒数来等待每个进度更新写入数据库。请注意,对于值 0、25、50、75 和 100,冷却时间始终会被忽略。

use Illuminate\Contracts\Queue\ShouldQueue;
use violetshih\MongoQueueMonitor\Traits\IsMonitored;

class LazyJob implements ShouldQueue
{
    use IsMonitored;

    public function progressCooldown(): int
    {
        return 10; // Wait 10 seconds between each progress update
    }
}

自定义数据

此软件包还允许在监控模型上以数组语法设置自定义数据。

use Illuminate\Contracts\Queue\ShouldQueue;
use violetshih\MongoQueueMonitor\Traits\IsMonitored;

class CustomDataJob implements ShouldQueue
{
    use IsMonitored;

    public function handle()
    {
        $this->queueData(['foo' => 'Bar']);

        // WARNING! This is overriding the monitoring data
        $this->queueData(['bar' => 'Foo']);

        // To preserve previous data and merge the given payload, set the $merge parameter true
        $this->queueData(['bar' => 'Foo'], true);
    }
}

为了在用户界面上显示自定义数据,您需要在 config/queue-monitor.php 下添加此行。

'ui' => [
    ...

    'show_custom_data' => true,

    ...
]

仅保留失败的作业

您可以通过覆盖 keepMonitorOnSuccess() 方法来仅存储已执行作业的失败监控条目。如果您只想保留经常执行但值得监控的失败监控,则可以使用此功能。或者,您可以使用 Laravel 内置的 failed_jobs 表。

use Illuminate\Contracts\Queue\ShouldQueue;
use violetshih\MongoQueueMonitor\Traits\IsMonitored;

class FrequentSucceedingJob implements ShouldQueue
{
    use IsMonitored;

    public static function keepMonitorOnSuccess(): bool
    {
        return false;
    }
}

检索已处理的作业

use violetshih\MongoQueueMonitor\Models\Monitor;

$job = Monitor::query()->first();

// Check the current state of a job
$job->isFinished();
$job->hasFailed();
$job->hasSucceeded();

// Exact start & finish dates with milliseconds
$job->getStartedAtExact();
$job->getFinishedAtExact();

// If the job is still running, get the estimated seconds remaining
// Notice: This requires a progress to be set
$job->getRemainingSeconds();
$job->getRemainingInterval(); // Carbon\CarbonInterval

// Retrieve any data that has been set while execution
$job->getData();

// Get the base name of the executed job
$job->getBasename();

模型作用域

use violetshih\MongoQueueMonitor\Models\Monitor;

// Filter by Status
Monitor::failed();
Monitor::succeeded();

// Filter by Date
Monitor::lastHour();
Monitor::today();

// Chain Scopes
Monitor::today()->failed();

本软件包是基于 romanzipp 的 laravel-queue-monitor 的分支。