violetshih / laravel-mongo-queue-monitor
Laravel MongoDb 作业队列的队列监控
Requires
- php: ^7.2|^8.0|^8.1
- ext-json: *
- ext-mbstring: *
- illuminate/database: ^7.30.3|^8.22.1|^9.0|^10.0
- illuminate/queue: ^7.30.3|^8.22.1|^9.0|^10.0
- illuminate/support: ^7.30.3|^8.22.1|^9.0|^10.0
- jenssegers/mongodb: ^3.8|^3.9|^4.0
- nesbot/carbon: ^2.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.17
- laravel/framework: ^7.30.3|^8.22.1|^9.0|^10.0
- mockery/mockery: ^1.3.2
- orchestra/testbench: ^3.8|^4.0|^5.0|^6.0
- phpunit/phpunit: ^8.0|^9.0|^10.0
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(); });
路由
有关更多信息,请参阅 完整配置文件。
扩展使用方法
进度
您可以设置一个 进度值(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 的分支。