phparmory / rate
具有不同策略的速率限制器
0.2.1
2016-05-23 07:25 UTC
Requires
- beberlei/assert: ^2.5
- ramsey/uuid: ^2.9
Requires (Dev)
- phpunit/phpunit: ^5.3
Suggests
- illuminate/cache: Required to use the Laravel repository driver (~5.1.*)
- predis/predis: Required to use the Redis repository driver (~1.0).
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