节流模式 Throttling Pattern

未匹配的标注

描述

控制一个应用程序使用的资源。

背景和问题

一些突发活动使得系统的处理要求超过了可用资源的能力,可能使系统发生故障。

解决方案

节流器
  1. 设置系统定义的阈值,根据实际业务调节用请求。
  2. 设置每秒最大的请求次数。
  3. 一些系统设置,默认设置损耗最小的模式。例如,视频流魔人分辨率最小。
  4. VIP用户和普通用户设置优先级。

注意事项

  1. 节流策略一定要根据实际业务设计,并且能有多套节流策略,能支持不同情况使用不同的策略,也要能动态切换策略。
  2. 节流器的性能要保证。节流器监控的性能指标需要不断捕获和监测。
  3. 节流器如果拒绝用户的请求,需要返回一个特定的标识,客户端可以根据实际情况处理,例如可以等待一段时间,然后重试该请求。

何时使用

  1. 维护系统的稳定性。
  2. 防止单个用户独占系统资源。
  3. 防止突发的性能活动。

结构中包含的角色

  1. Throttling 节流器
  2. Limiter 抽象限制
  3. ConcreteLimiter 具体限制
  4. 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;

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
发起讨论 只看当前版本


暂无话题~