dyrynda / laravel-defibrillator
确保您的 Laravel 应用保持正常心跳
Requires
- php: ^8.1
- illuminate/cache: ^10.0
- illuminate/config: ^10.0
- illuminate/contracts: ^10.0
- illuminate/support: ^10.0
- spatie/laravel-package-tools: ^1.4.3
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.1
- nunomaduro/collision: ^7.0
- orchestra/canvas: ^8.0
- orchestra/testbench: ^8.0
- pestphp/pest: ^2.0
- phpstan/phpstan: ^1.0
- spatie/laravel-ray: ^1.28
- symfony/var-dumper: ^6.0
README
确保您的 Laravel 应用保持正常节奏
Laravel Defibrillator 有助于确保应用中应定期运行的方面确实如此。
安装
您可以通过 composer 安装此包
composer require dyrynda/laravel-defibrillator
您可以使用以下命令发布配置文件
php artisan vendor:publish --provider="Dyrynda\Defibrillator\DefibrillatorServiceProvider" --tag="laravel-defibrillator-config"
用法
当检测到异常的心跳节奏时,您可以通过除颤器将心脏恢复到正常状态。
<?php if ($this->hasAbnormalRhythm()) { $this->defibrillate(); return; }
究竟是怎么回事?
考虑一个定期任务,该任务定期与您的应用程序用户进行通信。
该定时任务根据您应用程序中的某些条件将通知排队到您的用户中。
在正常情况下,有一些通知需要发送,它们将在几秒钟内发送。
但应用程序错误导致您的应用程序失去控制。
排队的通知堆积,您的数据库没有更新以标记通知已发送,错误跟踪器充满了异常。
然后定时任务再次运行。
突然,您的队列中有成千上万个待处理作业,您陷入了一个无法跟上循环。
进入 Laravel Defibrillator
Laravel Defibrillator 有助于您跟踪应用中预期定期调用的各个组件。
在每次执行时,您调用 defibrillate()
方法来更新缓存值,设置可接受的心跳。
例如;
<?php // app/Console/Kernel.php $schedule->job(NotifyUsers::class)->everyMinute(); // app/Jobs/NotifyUsers.php public function handle() { if ($this->hasAbnormalRhythm()) { $this->defibrillate(); return; } // Regular processing $this->defibrillate(); }
默认情况下,调用 defibrillate()
将将一个项放入您配置的缓存中,使用 Carbon
实例 90 秒后的时间。缓存键是调用类的基准名。例如,App\Jobs\NotifyUsers
类的缓存键将是 NotifyUsers
。如果您希望对这一点有更多控制,可以在您的类中覆盖 heart()
方法。
在正常操作范围内,您的定时任务将每 60 秒执行一次,并将缓存值再推 90 秒。
然而,如果您的数据库过载,或者队列中充满了积压的电子邮件通知,并且您的定时任务错过了一次执行,并且缓存值已过期,那么除颤器将不会进一步增加数据库的压力或向队列中推送更多通知,而是将缓存值再推 90 秒。
这样做,您给数据库一个机会来跟上队列积压,而无需手动干预。
您甚至可以在心跳在定时任务运行和通知尝试发送之间进入异常节奏时防止延迟通知被发送
<?php // app/Notifications/CustomerNotification.php public function shouldSend(): bool { return Cache::get('NotifyUsers')?->isFuture() ?? false; }
我将如何知道这种情况正在发生?
这超出了此包的范围,但是,如果您在异常节奏中超过阈值,您可以考虑有条件地发送通知。
<?php // app/Jobs/NotifyUsers.php public function handle() { if ($this->hasAbnormalRhythm()) { $this->defibrillate(); + + CardiacEvent::dispatchIf(Cache::increment("{$this->heart()}:skipped") === 3); return; } // Regular processing $this->defibrillate(); + + Cache::forget("{$this->heart()}:skipped"); }
这样,如果您有 3 次连续的除颤,您可以发送电子邮件、短信、Slack 等通知来处理情况!
或者,您可以考虑使用类似于 thenping.me 的定时任务监控解决方案。
配置
您可以通过设置 defibrillator.interval
配置值或通过在您使用 Defibrillator
特性时添加 interval
方法来按类覆盖默认的心跳间隔。
<?php use Dyrynda\Defibrillator\Defibrillator; class Artisan { use Defibrillator; public function interval(): int { return 30; } }
支持开发
如果您想支持该包的持续维护和开发,请考虑在GitHub上赞助我。
测试
composer test
变更日志
有关最近更改的更多信息,请参阅变更日志。
贡献
有关详细信息,请参阅贡献指南。
安全漏洞
有关如何报告安全漏洞,请审查我们的安全策略。
鸣谢
许可证
MIT许可证(MIT)。有关更多信息,请参阅许可证文件。