mpbarlow/laravel-queue-debouncer

用于防抖其他队列作业的包装作业。

2.6.0 2024-03-23 11:39 UTC

This package is auto-updated.

Last update: 2024-09-23 12:45:49 UTC


README

简单的队列作业防抖

要求

  • Laravel >= 6.0
  • 一个异步队列驱动程序

注意: v2.0 需要 Laravel 6 或更高版本。对于 Laravel 5.5 到 6.0 的支持,请查看 v1.0.2

安装

composer require mpbarlow/laravel-queue-debouncer

背景

此包允许您的 Laravel 应用程序中的任何队列作业或链都可以进行防抖,这意味着无论在指定的超时窗口内分发多少次,它都只会运行一次。

例如,假设每次记录更新时都会分发一个作业来重建缓存,但作业非常耗费资源。使用五分钟等待时间进行防抖可以确保缓存只在您完成更改后的五分钟内重建一次。

用法

防抖作业可以像其他任何分发的作业一样处理。防抖器接受两个参数,即您要运行的真正 $job 以及 $wait 期间。

与常规分发一样,$job 可以是一个实现了 Illuminate\Foundation\Bus\Dispatchable 的类、一个链或一个闭包。 $wait 接受分发上的 delay 方法可以接受的所有参数(例如,一个 DateTimeInterface 或秒数)。

防抖器返回一个 Illuminate\Foundation\Bus\PendingDispatch 实例,这意味着防抖过程本身可以被分配到不同的队列或进行其他操作。

调用防抖器

有多种使用防抖器的方法

依赖注入

use App\Jobs\MyJob;
use Mpbarlow\LaravelQueueDebouncer\Debouncer;

class MyController
{
    public function doTheThing(Debouncer $debouncer)
    {
        $debouncer->debounce(new MyJob(), 30);

        // The class is also invokable:
        $debouncer(new MyJob(), 30);
    }
}

门面

use App\Jobs\MyJob;
use Mpbarlow\LaravelQueueDebouncer\Facade\Debouncer;

Debouncer::debounce(new MyJob, 30);

辅助函数

use App\Jobs\MyJob;

debounce(new MyJob(), 30);

特质

use Illuminate\Bus\Queueable;
use Illuminate\Foundation\Bus\Dispatchable;
use Mpbarlow\LaravelQueueDebouncer\Traits\Debounceable;

class MyJob {
    use Debounceable, Dispatchable, Queueable;
}

MyJob::debounce('foo', 'bar', 'baz', 30);

当监控队列时,您会在每次防抖作业入队时看到该包的内部分发程序的条目,但作业本身只在最终等待时间到期时运行一次。

例如,假设以下代码在上午9点正好运行

class MyJob
{
    use Dispatchable;

    public function handle()
    {
        echoHello!\n”;
    }
}

$job = new MyJob();

debounce($job, now()->addSeconds(5));
sleep(3);

debounce($job, now()->addSeconds(5));
sleep(3);

debounce($job, now()->addSeconds(5));

您应该在您的队列上期望以下活动

[2020-03-11 09:00:05][vHmqrBYeLtK3Lbiq5TsTZxBo2igaCZHC] Processing: Closure (DispatcherFactory.php:28)
[2020-03-11 09:00:05][vHmqrBYeLtK3Lbiq5TsTZxBo2igaCZHC] Processed:  Closure (DispatcherFactory.php:28)
[2020-03-11 09:00:08][LXdzLvilh5qhew7akNDnibCjaXksG81X] Processing: Closure (DispatcherFactory.php:28)
[2020-03-11 09:00:08][LXdzLvilh5qhew7akNDnibCjaXksG81X] Processed:  Closure (DispatcherFactory.php:28)
[2020-03-11 09:00:11][MnPIqk5fCwXjiVzuwPjkkOdPPBn0xR4d] Processing: Closure (DispatcherFactory.php:28)
[2020-03-11 09:00:11][MnPIqk5fCwXjiVzuwPjkkOdPPBn0xR4d] Processed:  Closure (DispatcherFactory.php:28)
[2020-03-11 09:00:11][I2hvBoCB71qZQeD4umn5dd90zJUCAlJ5] Processing: App\Jobs\MyJob
Hello!
[2020-03-11 09:00:11][I2hvBoCB71qZQeD4umn5dd90zJUCAlJ5] Processed:  App\Jobs\MyJob

自定义行为

此包提供了一些钩子来定制您所需的内容。要覆盖默认行为,您应该发布配置文件

php artisan vendor:publish --provider="Mpbarlow\LaravelQueueDebouncer\ServiceProvider"

这将把 queue_debouncer.php 复制到您的配置目录。

缓存键提供者

为了识别正在防抖的作业,该包为每种作业类型生成一个唯一的缓存键。

包含两个缓存键提供者

  • Mpbarlow\LaravelQueueDebouncer\Support\CacheKeyProvider(默认):使用配置的 cache_prefix 值,可以是基于类的作业的完全限定类名,或者闭包作业的 SHA1 哈希。
  • Mpbarlow\LaravelQueueDebouncer\Support\SerializingCacheKeyProvider:使用配置的 cache_prefix 值,对序列化作业进行 SHA1 哈希。如果您想根据除类名之外的因子(例如,某些内部状态)防抖作业,请使用此提供者。如果需要防抖链,这也需要此提供者,因为默认提供者会将您的应用程序分发的所有链作为相同的作业进行防抖,而不管包含哪些作业。

或者,您可以提供自己的类或闭包来覆盖任何其他您可能需要的操作

如果您提供一个类,它应该实现 Mpbarlow\LaravelQueueDebouncer\Contracts\CacheKeyProvider。请注意,如果还需要这种行为,您的类负责获取和前缀缓存前缀。

基于类的提供者可以通过在配置中更改 cache_key_provider 的值来作为默认提供者全局注册。或者,您可以使用 usingUniqueIdentifierProvider 方法“热替换”提供者。

$debouncer
    ->usingCacheKeyProvider(new CustomCacheKeyProvider())
    ->debounce($job, 10);

如果您提供了一个闭包,则只能进行热替换。

$debouncer
    ->usingCacheKeyProvider(fn () => 'my custom key')
    ->debounce($job, 10);

闭包提供者会自动在其值前加上配置的 cache_prefix。要覆盖此行为,请实现一个基于类的提供者,该提供者在构造函数中接受一个闭包,然后在 getKey 方法中调用它。

唯一标识符提供者

每次分发防抖作业时,都会将唯一标识符存储在作业的缓存键中。当等待时间到期时,如果该标识符与当前作业的值匹配,防抖器就会知道没有更近的作业实例已被分发,因此可以安全地分发它。

默认实现为每次分发生成一个UUID v4。如果您需要覆盖此行为,您可以像缓存键提供者那样做,在配置中全局注册一个类在 unique_identifier_provider 键下,或者使用 usingUniqueIdentifierProvider 方法进行热替换。

$debouncer
    ->usingUniqueIdentifierProvider(new CustomUniqueIdentifierProvider())
    ->debounce($job, 10);

$debouncer
    ->usingUniqueIdentifierProvider(fn () => 'my custom identifier')
    ->debounce($job, 10);

基于类的提供者应该实现 Mpbarlow\LaravelQueueDebouncer\Contracts\UniqueIdentifierProvider

许可证

本软件包是开源软件,根据 MIT许可证 提供。