具有不同策略的速率限制器

0.2.1 2016-05-23 07:25 UTC

This package is not auto-updated.

Last update: 2024-09-26 01:10:15 UTC


README

一个简单但可扩展的速率限制器包。

安装

使用composer安装。

composer require phparmory/rate

速率限制器需要PHP7才能运行。

文档

参与者

参与者是可以进行速率限制的实体。它们通过IP地址进行标识

use Armory\Rate\{
    ActorFactory
};

$actorFactory = new ActorFactory();

$actor = $actorFactory->create('127.0.0.1');

事件

事件是可以进行速率限制的实体。事件通过名称标识,可以具有成本(稍后讨论)并由参与者触发。

use Armory\Rate\{
    EventFactory
};

$eventFactory = new EventFactory();

$event = $eventFactory->create('request.user.api', 1, $actor); // Cost of 1

速率限制

速率限制包含有关施加限制的信息的实体。速率限制可以包含多个尝试次数、时间范围和惩罚(稍后讨论)。

use Armory\Rate\{
    RateLimitFactory
};

$rateLimitFactory = new RateLimitFactory();

$rateLimit = $rateLimitFactory->create(100, 60, 10); // 100 requests per minute (60 seconds) with a penalty of 10 seconds for hitting the rate limit

事件存储库

事件可以持久化到存储介质,以便在请求之间施加速率限制。Rate附带一个FakeRepository(内存中)以供您开始。

use Armory\Rate\{
    EventRepositoryFactory
};

$eventRepositoryFactory = new EventRepositoryFactory();

$repository = $eventRepositoryFactory->create(); // Defaults to FakeRepository

速率限制器

速率限制器是定义速率限制策略的服务。Rate附带两种主要的速率限制策略

  • 基本速率限制,例如每小时100次请求
  • 动态速率限制,即漏桶算法
use Armory\Rate\{
    RateLimiterFactory
};

$rateLimiterFactory = new RateLimiterFactory();

$rateLimiter = $rateLimiterFactory->dynamic($event, $limit, $repository);

$rateLimiter->run();

如果超过速率限制,它将抛出 Armory\Rate\Exceptions\RateLimitExceededException

成本

成本允许实现成本/余额实现,即对速率限制器施加100的限制给参与者100个信用额。每个事件“成本”一定数量的信用额,这些信用额从总余额中扣除。例如

use Armory\Rate\{
    EventFactory;
};

$eventFactory = new EventFactory;

$userApi = $eventFactory->create('user.api', 1, 0); // 1 credit
$postsApi = $eventFactory->create('posts.api', 2, 0); // 2 credits

惩罚

创建事件时允许您指定达到速率限制的惩罚。如果达到速率限制,惩罚时间将防止速率限制通过,即使参与者通常有信用额。

use Armory\Rate\{
    EventFactory
};

$eventFactory = new EventFactory;

$userApi = $eventFactory->create('user.api', 1, 20); // Hitting the rate limit puts the actor in timeout for 20 seconds