telkins / laravel-job-funneling-middleware
一个可以分流任务的中间件。
Requires
- php: ^7.3|^8.0
- illuminate/redis: ^6.0|^7.0|^8.0|^9.0
Requires (Dev)
- orchestra/testbench: ^4.0|^5.0|^6.0|^7.0
- phpunit/phpunit: ^9.0|^9.3
- symfony/var-dumper: ^4.0|^5.0
README
此包包含一个 工作中间件,可以在 Laravel 应用中分流任务。
特别感谢
由 Freek Van der Herten 授予复制 Spatie 的 laravel-rate-limited-job-middleware 的许可,并将其重命名并维护在我的名下。因此,此包的大部分内容都是基于他们的。谢谢...! :-)
安装
您可以通过 composer 安装此包
composer require telkins/laravel-job-funneling-middleware
此包要求在您的 Laravel 应用中设置 Redis。
使用方法
默认情况下,中间件将只允许一次执行一个任务。不允许的任务将被释放 5 秒。
要将中间件应用到任务中,只需将 Telkins\JobFunnelingMiddleware\Funneled
添加到任务的中间件中。
namespace App\Jobs; use Illuminate\Bus\Queueable; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Telkins\JobFunnelingMiddleware\Funneled; class TestJob implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable; public function handle() { // your job logic } public function middleware() { return [new Funneled()]; } }
配置尝试次数
当使用速率限制,包括分流时,您的任务尝试次数可能难以预测。与其使用固定次数的尝试,不如使用 基于时间的尝试。
您可以将此添加到您的任务类中
/* * Determine the time at which the job should timeout. * */ public function retryUntil() : \DateTime { return now()->addDay(); }
自定义行为
您可以自定义所有行为。以下是一个示例,其中中间件允许一次执行最多 3 个任务。不允许的任务将被释放 90 秒。
// in your job public function middleware() { $funneledMiddleware = (new Funneled()) ->limit(3) ->releaseAfterSeconds(90); return [$funneledMiddleware]; }
自定义 Redis
默认情况下,中间件将使用默认的 Redis 连接。
在 Redis 中将使用的默认键将是创建中间件实例的类的名称。在大多数情况下,这将是在其中应用中间件的任务的名称。如果这不是您期望的,您可以使用 key
方法来自定义它。
以下是一个使用自定义连接和自定义键的示例。
// in your job public function middleware() { $funneledMiddleware = (new Funneled()) ->connection('my-custom-connection') ->key('my-custom-key'); return [$funneledMiddleware]; }
有条件地应用中间件
如果您想有条件地应用中间件,可以使用 enabled
方法。它接受一个布尔值,用于确定是否应分流您的任务。
您还可以向 enabled
传递一个 Closure
。如果它评估为真值,则中间件将被启用。
以下是一个愚蠢的示例,其中分流仅在 1 月份激活。
// in your job public function middleware() { $shouldFunnelJobs = Carbon::now()->month === 1; $funneledMiddleware = (new Funneled()) ->enabled($shouldFunnelJobs); return [$funneledMiddleware]; }
可用方法。
这些方法可以在中间件上调用。它们的名字应该一目了然。
limit(int $limitedNumberOfJobs)
releaseAfterOneSecond()
releaseAfterSeconds(int $releaseInSeconds)
releaseAfterOneMinute()
releaseAfterMinutes(int $releaseInMinutes)
releaseAfterRandomSeconds(int $min = 1, int $max = 10)
测试
composer test
变更日志
请参阅 CHANGELOG 了解最近更改的更多信息。
贡献
请参阅 CONTRIBUTING 了解详细信息。
安全
如果您发现任何与安全相关的问题,请通过电子邮件 travis.elkins+github@gmail.com 而不是使用问题跟踪器。
鸣谢
此代码主要基于Laravel文档中找到的分流示例。
许可证
MIT许可证(MIT)。请参阅许可证文件获取更多信息。