节流模式 Throttling Pattern
描述
控制一个应用程序使用的资源。
背景和问题
一些突发活动使得系统的处理要求超过了可用资源的能力,可能使系统发生故障。
解决方案
节流器
- 设置系统定义的阈值,根据实际业务调节用请求。
- 设置每秒最大的请求次数。
- 一些系统设置,默认设置损耗最小的模式。例如,视频流魔人分辨率最小。
- VIP用户和普通用户设置优先级。
注意事项
- 节流策略一定要根据实际业务设计,并且能有多套节流策略,能支持不同情况使用不同的策略,也要能动态切换策略。
- 节流器的性能要保证。节流器监控的性能指标需要不断捕获和监测。
- 节流器如果拒绝用户的请求,需要返回一个特定的标识,客户端可以根据实际情况处理,例如可以等待一段时间,然后重试该请求。
何时使用
- 维护系统的稳定性。
- 防止单个用户独占系统资源。
- 防止突发的性能活动。
结构中包含的角色
- Throttling 节流器
- Limiter 抽象限制
- ConcreteLimiter 具体限制
- Request 请求者
可用到的设计模式思维
节流器可以定制很节流策略,不同的情况设置不同的策略,可以使用策略模式处理。
最小可表达代码
class Request {}
abstract class Limiter
{
// 可以在限制器中增加更新丰富的验证,例如用户id,ip,每分钟,甚至每秒的请求限制。
abstract public function maxAttempts() : int ;
}
class ConcreteLimiter extends Limiter
{
public function maxAttempts() : int
{
return 3;
}
}
class Throttling
{
protected $limiter;
public function __construct(Limiter $limiter)
{
$this->limiter = $limiter;
}
public function attempts(Request $request)
{
// 模拟数据
return rand(2, 5);
}
public function tooManyAttempts(Request $request)
{
// 请求超过限制
if ($this->attempts($request) >= $this->limiter->maxAttempts()) {
return true;
}
return false;
}
}
$request = new Request;
$throttling = new Throttling(new ConcreteLimiter);
$result = $throttling->tooManyAttempts($request);
var_dump($result);exit;
推荐文章: