vuthaihoc/moox-jobs

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

资助包维护!
mooxphp

v3.1.0 2024-09-04 09:48 UTC

This package is auto-updated.

Last update: 2024-09-19 08:34:40 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 切换回 Google 图标

如果您需要可配置的内容,请向我们提交问题。

手动安装

此 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 让您在应用程序的 UI 中完全控制。但是,从 Laravel 作业队列开始需要一些准备。

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

Laravel Forge

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

如果你不需要更改代码(在kernel.php中)就可以安排任何命令,你可能可以考虑使用Filament Database Schedule插件

更多信息

共享主机

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

你需要SSH访问权限来启动队列工作者,如下所示

php artisan queue:work

和Laravel Scheduler如下所示

php artisan schedule:work

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

更多信息

共享主机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的好方法是使用我们的

示例作业

你不需要更改你的作业以与Filament Job Monitor一起工作。但特别是对于长时间运行的作业,你可能会对这个示例感兴趣

<?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 特性的作业将在 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。

这将阻止导航项(s)被注册。

扩展性

虽然 Laravel 的队列系统和 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 Dashboard。Beanstalkd 的解决方案似乎已经过时,但您可以尝试使用 Laravel Beanstalkd Admin UI

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

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

变更日志

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

路线图

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

稳定性

用户体验

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

通知

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

Redis

  • 改进对Redis的支持
  • 将“软”依赖项添加到安装程序(Horizon或Predis?)

队列工作者和监督者

  • 改进对队列工作者和监督者的支持

SQS

  • 改进对亚马逊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 require的安装

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, Germany赞助。感谢您投资开源!

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

许可协议

MIT许可(MIT)。请参阅许可文件以获取更多信息。

鸣谢

此FILAMENT插件深受启发(使用概念和/或代码)来自

两者均受MIT许可证保护。衷心感谢作者们!!!