moox/jobs

在 Filament 中管理作业队列、失败作业和批次

资助包维护!
mooxphp

3.2.1 2024-09-05 10:42 UTC

README

Moox Jobs

Moox Jobs

管理 Filament 中的作业队列、失败作业和批次。

如果使用数据库驱动程序进行队列,则可以作为 Laravel Horizon 的替代方案。如果您使用 Redis,则它是 Laravel Horizon 的好插件。有关 Redis、Amazon SQS 和 Beanstalkd 兼容性的更多信息,请参阅下面的限制。有关 Laravel 作业队列以及 Moox Jobs 的工作原理的更多信息,请参阅我们的入门指南

要求

Moox Jobs 需要

简而言之

composer create-project laravel/laravel moox-jobs-demo
composer require filament/filament
php artisan filament:install --panels
php artisan make:filament-user

从 Moox Jobs V2 升级

Moox Jobs V3 需要更改数据库模式。我们为您提供了一个方便的更新命令

composer update
php artisan mooxjobs:update

更新命令会处理更改和创建新字段,而不会丢失数据。或者,您可以删除 job-manager 表,然后简单地运行以下安装命令。

快速安装

这两个命令就是您安装包所需的所有内容

composer require moox/jobs
php artisan mooxjobs:install

好奇安装命令的作用?请参阅下面的手动安装

功能

作业

监控正在运行和已完成的作业。

screenshot-jobs

等待作业

查看所有等待作业,删除一个、多个或甚至一次性删除所有等待作业,在它们进入队列之前。是的,我们不仅支持暗黑模式。

screenshot-waiting

失败作业

查看所有失败作业,包括详细信息,重试或删除单个作业、多个作业或一次性删除所有失败作业。

screenshot-details

screenshot-detail

作业批次

监控您的作业批次,修剪批次。

screenshot-batches

配置

包的配置正在开发中。为了使其更适合集成商,我们将很快增加更多灵活性和更好的翻译。

3.1 中的新功能是切换到 Google 图标,并能够在 将 Moox Core 中的图标切换回 Heroicons

如果您需要可以配置的内容,请给我们发一个问题。

手动安装

此 Laravel 包是为 FilamentPHP 和出色的 TALL-Stack 制作的。如果您不想使用我们的安装命令,请按照以下手动步骤安装包。

通过 Composer 安装包

composer require moox/jobs

创建必要的表

php artisan vendor:publish --tag="jobs-manager-migration"
php artisan vendor:publish --tag="jobs-batch-migration"
php artisan vendor:publish --tag="jobs-queue-migration"
php artisan vendor:publish --tag="jobs-manager-foreigns-migration"

# Queue tables, if using the database driver
# Not required for Redis, Amazon SQS or Beanstalkd
php artisan queue:table
php artisan queue:failed-table
php artisan queue:batches-table

php artisan migrate

使用以下命令发布配置文件

php artisan vendor:publish --tag="jobs-config"

这是发布配置文件的内容

return [
    'resources' => [
        'jobs' => [
            'enabled' => true,
            'label' => 'Job',
            'plural_label' => 'Jobs',
            'navigation_group' => 'Job manager',
            'navigation_icon' => 'heroicon-o-play',
            'navigation_sort' => 1,
            'navigation_count_badge' => true,
            'resource' => Moox\Jobs\Resources\JobsResource::class,
        ],
        'jobs_waiting' => [
            'enabled' => true,
            'label' => 'Job waiting',
            'plural_label' => 'Jobs waiting',
            'navigation_group' => 'Job manager',
            'navigation_icon' => 'heroicon-o-pause',
            'navigation_sort' => 2,
            'navigation_count_badge' => true,
            'resource' => Moox\Jobs\Resources\JobsWaitingResource::class,
        ],
        'failed_jobs' => [
            'enabled' => true,
            'label' => 'Failed Job',
            'plural_label' => 'Failed Jobs',
            'navigation_group' => 'Job manager',
            'navigation_icon' => 'heroicon-o-exclamation-triangle',
            'navigation_sort' => 3,
            'navigation_count_badge' => true,
            'resource' => Moox\Jobs\Resources\JobsFailedResource::class,
        ],
        'job_batches' => [
            'enabled' => true,
            'label' => 'Job Batch',
            'plural_label' => 'Job Batches',
            'navigation_group' => 'Job manager',
            'navigation_icon' => 'heroicon-o-inbox-stack',
            'navigation_sort' => 4,
            'navigation_count_badge' => true,
            'resource' => Moox\Jobs\Resources\JobBatchesResource::class,
        ],
    ],
    'pruning' => [
        'enabled' => true,
        'retention_days' => 7,
    ],
];

app/Providers/Filament/AdminPanelProvider.php 中注册插件

->plugins([
    \Moox\Jobs\JobsPlugin::make(),
    \Moox\Jobs\JobsWaitingPlugin::make(),
    \Moox\Jobs\JobsFailedPlugin::make(),
    \Moox\Jobs\JobsBatchesPlugin::make(),
])

您也可以像这样在 AdminPanelProvider 中完成所有设置

->plugins([
	\Moox\Jobs\JobsPlugin::make()
	    ->label('Job runs')
	    ->pluralLabel('Jobs that seems to run')
	    ->enableNavigation(true)
	    ->navigationIcon('heroicon-o-face-smile')
	    ->navigationGroup('My Jobs and Queues')
	    ->navigationSort(5)
	    ->navigationCountBadge(true)
	    ->enablePruning(true)
	    ->pruningRetention(7),
	\Moox\Jobs\JobsWaitingPlugin::make()
	    ->label('Job waiting')
	    ->pluralLabel('Jobs waiting in line')
	    ->enableNavigation(true)
	    ->navigationIcon('heroicon-o-calendar')
	    ->navigationGroup('My Jobs and Queues')
	    ->navigationSort(5)
	    ->navigationCountBadge(true)
	\Moox\Jobs\JobsFailedPlugin::make()
	    ->label('Job failed')
	    ->pluralLabel('Jobs that failed hard')
	    ->enableNavigation(true)
	    ->navigationIcon('heroicon-o-face-frown')
	    ->navigationGroup('My Jobs and Queues')
	    ->navigationSort(5)
	    ->navigationCountBadge(true)
])

您不需要注册所有资源。如果您不使用作业批次,可以通过不注册它来隐藏此功能。

作业入门指南

作业队列非常有用。每个需要超过几秒钟的任务都可以在后台处理,而 Moox Jobs 可以让您完全控制应用程序的用户界面。但是,要从 Laravel 作业队列开始需要一些准备。

第一个决定取决于您的托管和部署

Laravel Forge

Laravel Forge支持Redis、Horizon和Supervisor。最佳做法是安装Horizon并在Forge UI中启用它。然后您可以安排任何作业(或调度您的作业的命令)。

如果您想在无需更改代码(在kernel.php中)的情况下安排任何命令,您可以考虑使用Filament数据库调度插件

更多信息

共享主机

在大多数共享主机和托管服务器上,Redis和Supervisor不可用。好事:在共享主机上使用Moox Jobs将完美工作。使用数据库队列驱动程序,您将能够轻松监控和控制您的作业和批处理。

您需要SSH访问权限以启动队列工作进程,如下所示

php artisan queue:work

以及Laravel Scheduler,如下所示

php artisan schedule:work

自动化作业(并在失败后重新运行队列:worker)的最佳方式是创建一个crontab来每分钟运行Laravel Scheduler,并使用Filament数据库调度插件运行您的作业(或命令)。

更多信息

共享主机API

Moox Core中的共享主机API允许从URL进行schedule/run。在Moox Jobs中,我们使用此功能从URL执行queue:work

您可以在URL中添加一个可选的timeout参数,以指定队列工作进程的超时时间(以秒为单位)。如果没有指定超时,则使用默认的超时时间60秒。

如果您想使用共享主机API,您需要将核心配置中的SHARED_HOSTING_ENABLED设置为true,并将SHARED_HOSTING_TOKEN配置为安全令牌。

根服务器

在根服务器、VPS或云服务器Droplet上,最快的方式是像共享主机一样进行作业排队。但是,由于Redis与Supervisor的组合更加稳定,速度快出至少两倍,您还可以考虑使用root权限手动安装Redis和Supervisor,或者(根据您的提供商和部署方式,可能是Forge、Envoyer或Ploi.io)使用更方便的UI。

更多信息

Laravel Vapor

在Laravel Vapor上,这是无服务器(使用Amazon AWS Lambda服务)的第一方部署工具,Laravel将自动使用Amazon SQS(简单队列服务)作为队列驱动程序。Laravel SQS部分由Moox Jobs支持,这意味着您可以使用Moox Jobs监控作业和失败的作业、重试失败的作业并使用进度功能。当前尚未实现待处理作业和批处理。

更多信息

当您的作业队列启动并运行时,测试Moox Jobs的好方法是使用我们的

演示作业

您不需要更改您的作业中的任何内容即可与Filament作业监控一起工作。但对于长时间运行的作业,您可能会发现此示例很有趣

<?php

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Moox\Jobs\Traits\JobProgress;

class DemoJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, JobProgress, Queueable, SerializesModels;

    public $tries;

    public $timeout;

    public $maxExceptions;

    public $backoff;

    public function __construct()
    {
        $this->tries = 10;
        $this->timeout = 120;
        $this->maxExceptions = 3;
        $this->backoff = 240;
    }

    public function handle()
    {
        $count = 0;
        $steps = 10;
        $final = 100;

        while ($count < $final) {
            $this->setProgress($count);
            $count = $count + $steps;
            sleep(10);
        }
    }
}

在app/Jobs/中创建一个名为DemoJob.php的文件,并将上面的内容复制过去。

自定义作业名称

默认情况下,任务的名称来自类的名称。这可以根据以下示例进行重写。

use Illuminate\Support\Carbon;
...
public function displayName()
{
    $now = Carbon::now();
    return "Demo Job | Started: ".$now;
}

演示作业命令

此示例命令将启动作业

<?php

namespace App\Console\Commands;

use App\Jobs\DemoJob;
use Illuminate\Console\Command;

class DemoJobCommand extends Command
{
    protected $signature = 'moox:demojob';

    protected $description = 'Start the Moox Demo Job';

    public function __construct()
    {
        parent::__construct();
    }

    public function handle()
    {
        $this->info('Starting Moox Demo Job');

        DemoJob::dispatch();

        $this->info('Moox Demo Job finished');
    }
}

在app/Console/Commands中创建一个名为DemoJobCommand.php的文件。然后执行

php artisan moox:demojob

以调度一个演示作业。

现在您可以在Filament UI中监控作业的进度。

进度

如上所述的演示作业所示,Moox Jobs自带进度功能。在您的作业中使用JobProgress特质是可选的。没有JobProgress-trait的作业将在Moox Jobs UI中运行并显示,只是缺少显示进度的舒适性。

如果您想使用进度功能,请记住

  • 使用进度功能时,如果没有安装Moox Jobs,您的任务将无法运行。如果您的任务属于可安装的包,您应该考虑在您的包中要求使用Moox Jobs。
  • 如果您想从您的应用程序中删除Moox Jobs,您必须在卸载Moox Jobs之前从您的任务中删除进度功能。
  • 编写setProgress可能无法提供关于进度的确切信息。但对于长时间运行的任务来说,查看任务挂起(或仅仅长时间中断)的位置可能很有趣。在没有关于进度的粘合剂的情况下调试任务可能要困难得多。

模型

Moox Jobs的数据库模型是使用Vemto设计的

jobs-model

授权

我们使用Filament Shield而不是它,因此代码没有得到充分测试。如果您遇到困难,请留下反馈。

如果您想阻止某些用户访问您的页面,您可以注册策略

use App\Policies\JobMonitorPolicy;
use Moox\Jobs\Models\FailedJob;
use Moox\Jobs\Models\JobBatch;
use Moox\Jobs\Models\JobMonitor;

class AuthServiceProvider extends ServiceProvider
{
	protected $policies = [
		JobManager::class => JobManagerPolicy::class,
		FailedJob::class => FailedJobPolicy::class,
		JobBatch::class  => JobBatchPolicy::class,
	];
}
namespace App\Policies;

use App\Models\User;
use Illuminate\Auth\Access\HandlesAuthorization;

class FailedJobPolicy
{
	use HandlesAuthorization;

	public function viewAny(User $user): bool
	{
		return $user->can('manage_failed_jobs');
	}
}

同样适用于FailedJobPolicy和JobBatchPolicy。

这将阻止导航项被注册。

扩展性

虽然Laravels队列系统和Laravel Horizon是为跨多个服务器生成(特别是批量)而设计的,但Moox Jobs尚未完全准备好此类使用。Moox Jobs的核心优势是Filament集成和可以管理在非Redis驱动器上运行的作业的可能性,而不是管理企业级服务器农场。

除此之外,Moox Jobs已经过测试,每小时可以管理数千个作业或每月数百万个作业。

screenshot-batches

限制

Moox Jobs非常适合数据库队列驱动程序。它可以在共享主机上运行良好,并提供作业监控、待处理作业、失败作业以及重试失败作业的可能性,而其他Laravel包如Horizon则不适用。

作业监控和失败作业也适用于Redis、SQS和Beanstalkd,但它不显示等待作业和作业批量。对于Redis,我们建议使用Laravel Horizon,对于Amazon SQS,请使用AWS仪表板。Beanstalkd的解决方案似乎已经过时,但您可以尝试使用Laravel Beanstalkd Admin UI

另一件事是使用Sync驱动器。由于Laravel中的Sync驱动器旨在用于开发和测试,因此它立即执行作业(同步)并且不利用队列。因此,它不使用failed_jobs、jobs或job_batches表。作业在同一个请求生命周期内立即执行,因此没有排队或存储作业。如果作业失败,它将在执行上下文中立即处理,而不是记录在failed_jobs表中。使用Sync驱动器运行的作业可能看起来像正在运行的作业,并且永远运行,即使它们已经完成或失败。

我们计划在将来扩展对所有队列驱动器的支持。请查看变更日志。

变更日志

有关最近更改的更多信息,请参阅CHANGELOG

路线图

由于Moox有许多部分(插件)需要开发,因此以下内容没有预期时间表...让我们称它们为想法。

稳定性

用户体验

  • 创建一个更美观的UI(图表、Apex?)和仪表板(监控器)
  • 测试进度条
  • 取消作业比删除作业更好,将它们标记为已取消
  • 区分失败(重试)和最终失败,或显示剩余重试次数(类似于尝试显示,但更明显)
  • 改进批次(部分失败/非失败,查看作业是否属于批次,点击过滤批次的作业)
  • 失败的作业资源不显示作业名称
  • 添加过滤并简化使用方法
  • 配置UX,在导航中

通知

  • 失败作业的通知/邮件和每日统计

Redis

  • 提高对Redis的支持
  • 将"软依赖"添加到安装程序中(Horizon或Predis?)

队列工作器和监控器

  • 提高对队列工作器和监控器的支持

SQS

  • 提高对Amazon SQS的支持或文档
  • 将"软依赖"添加到安装程序中(AWS SDK for PHP)

Beanstalkd

  • 提高对Beanstalkd的支持或文档

API,调度器,CRON

  • API
  • 调度器(可能是一个附加插件)
  • CRON(可能是一个附加插件)

贡献

我们欢迎每一个贡献!如果你能

  • 在此仓库中创建一个包含有关问题或想法的问题。我们将在几天内回复。
  • Monorepo中创建一个拉取请求。请勿向我们的只读仓库提交PR,它们尚未准备好代码更改。只有monorepo有质量门和自动测试。
  • 使用Weblate翻译Moox。
  • 告诉其他人关于Moox的信息或链接到我们。
  • 考虑一个捐赠或赞助

测试

Moox Jobs目前没有完全自动化的测试(除了Laravel Pint、PHPStan和Codacy作为质量门之外),但我们正在努力自动化测试。我们需要两种类型的测试

  1. 安装和更新命令
  2. 安装的应用程序本身

并且还有一些需要考虑的事情

  • 是否已经安装了Filament?我们的安装程序包括Filament的自动安装。
  • 是否有需要迁移的数据?我们的更新器迁移现有数据,并需要示例数据来完成此操作。
  • 测试不同平台(Linux、Mac、Windows)、环境(Forge-Server、共享主机、本地开发)和队列驱动程序(Redis、数据库、同步、SQS、Beanstalkd)非常重要

测试安装

此安装运行在Forge、Vapor、共享主机、Mac和Windows上几个小时

composer create-project laravel/laravel moox-test
cd moox-test
mysqladmin -u root -p create moox-test
composer require filament/filament
php artisan filament:install --panels
php artisan make:filament-user
composer require moox/jobs
php artisan mooxjobs:install
mkdir monorepo
cd monorepo
git clone https://github.com/mooxphp/moox
cp app/Jobs/* ../app/Jobs/
cp app/Console/Commands/* ../app/Console/Commands/
cp app/Console/kernel.php ../app/Console/kernel.php
# final steps depend on the target system
composer require laravel/horizon # Forge only
php artisan queue:work
php artisan schedule:work

测试更新

composer create-project laravel/laravel moox-test
cd moox-test
mysqladmin -u root -p create moox-test
composer require filament/filament
php artisan filament:install --panels
php artisan make:filament-user
composer require moox/jobs:2.0.9
php artisan mooxjobs:install
mkdir monorepo
cd monorepo
git clone https://github.com/mooxphp/moox
mysql -u root -p moox-test < database/sql/jobs/v2/failed_jobs.sql
mysql -u root -p moox-test < database/sql/jobs/v2/job_batches.sql
mysql -u root -p moox-test < database/sql/jobs/v2/job_manager.sql
mysql -u root -p moox-test < database/sql/jobs/v2/jobs.sql
cd ..
composer require moox/jobs:3.0
composer update
php artisan mooxjobs:update

带有Filament安装的测试安装

composer create-project laravel/laravel moox-test
cd moox-test
mysqladmin -u root -p create moox-test
composer require filament/filament
composer require moox/jobs
php artisan mooxjobs:install

带有Filament要求的测试安装

composer create-project laravel/laravel moox-test
cd moox-test
mysqladmin -u root -p create moox-test
composer require moox/jobs
php artisan mooxjobs:install

测试后清理

mysql -u root -p drop database moox-test
cd ..
rm -Rf moox-test

赞助商

Moox的初始开发得到了德国heco gmbh的赞助。非常感谢对开源的投资!

如果您使用此插件,请考虑进行小额捐赠以保持此项目的维护。特别是如果是商业项目,计算起来相当简单。为开发者构建优秀产品的几美元或饥饿的开发者,他们产生错误或最坏的情况——需要放弃项目。是的,我们对我们钱包中的每一缕阳光都感到高兴;-)

许可证

MIT许可证(MIT)。有关更多信息,请参阅许可证文件

致谢

此Filament插件深受以下项目的启发(使用概念和/或代码):

两者均在MIT许可证下。向作者致以诚挚的感谢!!!