架构设计(限流)


架构设计(限流)

              

                    

                               

限流算法

          

漏斗算法:接受存储客户端请求(有最大值限制),后端匀速处理请求

                       

             

令牌桶算法:与漏斗算法相比,令牌桶算法可以快速处理短期突发流量

                       

客户端请求过来时,如果可以从桶中获取令牌,则执行请求,桶中令牌数减1;
如果不能获取令牌,客户端请求则进行等待;
后台线程定时向桶中添加令牌,桶中存放令牌数有最大限制

               

固定时间窗口限流:固定时间段内,拒绝处理超过阀值的请求

                       

说明:如果流量不均匀,可能出现在极短时间内处理超过阀值数量的请求,给后端服务器造成压力

         

滑动时间窗口限流

                       

将滑动窗口分割成多个小时间段窗口,每隔一个小时间段,滑动窗口向前移动
统计滑动时间窗覆盖的时间段的请求数量,如果超过设定的阀值,则拒绝请求

固定时间窗口相当于滑动时间窗口的特殊情况,时间窗口分隔的越多,限流统计越精确;
滑动时间窗口移动单位式分割的时间段,还是有可能出现任意一个滑动时间段的请求数超过阀值的情况
漏洞算法、令牌桶算法对流量控制更为精准

           

                   

                               

队列限流

       

如果请求不需要立刻响应,又需要处理流量高峰,可将请求发送到队列,异步处理请求

           

                 

                   

                               

sentinel 限流

       

流量控制策略

           

# QPS流量控制:每秒请求数超过预设的阀值后,触发流量控制
直接拒绝:默认的流量控制措施,超过阀值后,直接拒绝新的请求
冷启动:系统请求长期处于低水位,当流量突然增加后,直接将系统拉升到该水位可能将系统压垮,
      冷启动让流量缓慢增加值阀值,给系统预热时间,避免冷系统被压垮
匀速器:让系统匀速处理请求,类似于漏斗算法,主要用于处理间隔性突发流量,
       某一时间突然收到大量请求,接下来处于空闲状态,可利用空闲时间继续处理请求,而不是直接拒绝请求
 
# 并发线程数流量控制:线程数超过阀值,拒绝请求
sentinel线程数限流不负责创建和管理线程池,而是简单统计当前请求上下文的线程个数,
如果超出阈值,新的请求会被立即拒绝
 
# 基于调用关系的流量控制
调用方限流:default(不区分调用者)、针对特定调用者({some_origin_name})、其他调用者(other)限流
         同一个资源名可以配置多条规则,规则的生效顺序为:{some_origin_name} > other > default
调用链入口限流:一个资源有多个入口(entry、entry2),可选择只针对入口entry限流
关联流量控制:两个资源之间具有资源争抢或者依赖关系时,这两个资源便具有关联关系;
            如两个资源分别对数据库的同一字段进行写操作,一个资源频繁进行写操作,
             便会对另一资源的写操作产生影响,此时可考虑对频繁操作的资源进行限流