telkins/laravel-job-funneling-middleware

一个可以分流任务的中间件。

v0.4.0 2022-05-04 19:55 UTC

This package is auto-updated.

Last update: 2024-08-30 01:32:45 UTC


README

Latest Version on Packagist Build Status Quality Score StyleCI Total Downloads

此包包含一个 工作中间件,可以在 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)。请参阅许可证文件获取更多信息。