sunsgne/rate-limit
🐬 A PHP implementation of current limiting middleware for webman service HTTP-API 🐬
基于illuminate/redis 的令牌桶限流中间件
composer require sunsgne/rate-limit
在
webman
中使用
$moreRateLimit = Container::get(MoreRateLimitHandler::class);
$capacity = 60;
$seconds = 60;
$customerHandle = [
'class' => \support\Response::class,
'constructor' => [
429,
array(),
json_encode(['success' => false, 'msg' => '请求次数太频繁'], 256),
],
];
if (false === $moreRateLimit->handle(intval($capacity), intval($seconds))) {
$newClass = $customerHandle['class'];
return new $newClass(... \array_values($customerHandle['constructor']));
}
return $handler($request);
直接使用
$moreRateLimit = new \sunsgne\middleware\MoreRateLimit();
$capacity = 60;
$seconds = 60;
$customerHandle = [
'class' => \support\Response::class,
'constructor' => [
429,
array(),
json_encode(['success' => false, 'msg' => '请求次数太频繁'], 256),
],
];
if (false === $moreRateLimit->handle(intval($capacity), intval($seconds))) {
$newClass = $customerHandle['class'];
return new $newClass(... \array_values($customerHandle['constructor']));
}
参数名 | 示例 | 说明 |
---|---|---|
capacity | 60 | “桶”可以容纳的请求数 |
seconds | 60 | “桶”完全重新装满所需的时间 |
concurrency | true | 开启并发限流 |
cost | 1 | “桶”此操作使用的令牌数 |
进程数
24
,moreRateLimit
,无业务逻辑
并发数 | 平均值(ms) | 中位数(ms) | 最小值(ms) | 最大值(ms) | 吞吐量 |
---|---|---|---|---|---|
101 | 13 | 5 | 4 | 215 | 101.1 |
1001 | 241 | 244 | 49 | 428 | 952.4 |
10001 | 1600 | 2140 | 0 | 3249 | 1643.0 |
进程数
24
,RateLimit
,无业务逻辑
并发数 | 平均值(ms) | 中位数(ms) | 最小值(ms) | 最大值(ms) | 吞吐量 |
---|---|---|---|---|---|
101 | 7.0 | 7 | 6 | 11 | 104.1 |
1001 | 18 | 15 | 4.0 | 123 | 983.4 |
10001 | 1820 | 2359 | 0 | 3240 | 1793.0 |
进程数
24
,moreRateLimit
并发数 | 平均值(ms) | 中位数(ms) | 最小值(ms) | 最大值(ms) | 吞吐量 |
---|---|---|---|---|---|
101 | 351 | 302 | 4 | 1019 | 80.1 |
进程数
24
,RateLimit
并发数 | 平均值(ms) | 中位数(ms) | 最小值(ms) | 最大值(ms) | 吞吐量 |
---|---|---|---|---|---|
101 | 224 | 51 | 10 | 1004 | 70.1 |
- redis 使用
lua
脚本加锁