beholdr/laravel-backoff-limiter

Laravel 的指数退避速率限制器。

v0.1.1 2024-03-25 07:39 UTC

This package is auto-updated.

Last update: 2024-09-25 08:40:11 UTC


README

Latest Version on Packagist

Laravel 的指数退避速率限制器。

想象一下,您想通过发送短信验证客户的电话号码。但发送短信的费用很高,您不想允许过多的请求。Laravel 有 RateLimiter 类,但它非常简单。比如说,您每分钟接受 1 次尝试,但这允许一些不友好的人每分钟发送 1 条短信而没有任何惩罚。

使用 BackoffLimiter 类,您可以随着每次尝试而指数级增加退避时间。例如,第一次重试将在 1 分钟后可用,第二次在 4 分钟后,第三次在 9 分钟后等等。退避时间由以下公式确定

backoff_time = decay_time * attempts ^ exponent

支持

你喜欢 退避限制器 吗?请通过 Boosty 支持我。

安装

您可以通过 composer 安装此软件包

composer require beholdr/laravel-backoff-limiter

用法

您可以使用此软件包作为默认的 RateLimiter

use Beholdr\BackoffLimiter\BackoffLimiter;

$executed = app(BackoffLimiter::class)->attempt(
    'send-sms-'.request()->ip(),
    maxAttempts: 1,
    function () {
        // Send SMS
    }
)

if (! $executed) {
    throw new Exception('Too many requests!');
}

或手动控制尝试次数

use Beholdr\BackoffLimiter\BackoffLimiter;

$limiter = app(BackoffLimiter::class);
$key = 'send-sms-'.request()->ip();

if ($limiter->tooManyAttempts($key, 1)) {
    throw new Exception('Too many requests!');
}

$limiter->hit($key)

// Send SMS

您可以设置

  • 退避窗口:尝试计算的时间间隔。默认为 1 小时
  • 指数:确定退避时间长度。默认为 2

要设置自定义值,请将您的值传递到类创建时

$limiter = app(BackoffLimiter::class, ['backoff' => 3*60*60, 'exponent' => 3]);
$limiter->hit(...);

测试

composer test

许可证

MIT 许可证(MIT)。有关更多信息,请参阅 许可证文件