Skip to content

Latest commit

 

History

History
55 lines (49 loc) · 3.67 KB

2024-10-17-游戏推荐业务中基于sentinel的动态限流实践.md

File metadata and controls

55 lines (49 loc) · 3.67 KB

游戏推荐业务中基于sentinel的动态限流实践

TL;DR

本文介绍了基于sentinel的动态限流方案,通过参数优先级和实时流量动态调整限流阈值,解决现有限流方案的不足,实现更精细化、动态化的流量控制,保障核心场景可用性。

Summary

  1. 背景

    • 当前限流方案:使用公司vsentinel限流工具,包括QPS限流和热点参数限流。
      • QPS限流:限制资源(接口/方法)的QPS/并发数。
      • 热点参数限流:限制具体参数值的访问量。
    • 存在的问题
      • 无法做到每个场景的精细化限流。
      • 无法保证核心场景的可用性。
      • 需要及时调整限流阈值,不易维护。
      • 无法根据流量变化动态限流。
  2. 动态限流介绍

    • 配置方式:配置每个参数的优先级,根据参数的优先级动态调整限流阈值。
    • 实现原理:根据参数配置的优先级和实时流量,决定当前请求通过或拦截。
    • 总结:动态限流本质上是参数优先级限流,支持对参数值配置优先级,根据参数值的优先级进行动态流控。
  3. sentinel介绍

    • 原理:通过责任链模式实现不同模式的限流功能,责任链由一系列ProcessorSlot对象组成。
      • 辅助资源指标数据统计的ProcessorSlot:
        • NodeSelectorSlot:收集资源路径,树状存储调用路径。
        • ClusterBuilderSlot:存储资源的统计信息和调用者信息。
        • StatisticSlot:实现指标数据统计。
      • 实现限流降级功能的slot:
        • ParamFlowSlot:根据请求参数进行限流。
        • SystemSlot:根据系统负载情况进行限流。
        • AuthoritySlot:根据调用者身份进行限流。
        • FlowSlot:根据QPS进行限流。
        • DegradeSlot:实现熔断降级功能。
    • 滑动窗口计数器算法
      • 计数器算法:维护一个固定单位时间的计数器来统计请求数。
      • 滑动窗口计数器算法:将时间划分为细粒度的区间,每个区间维持一个计数器,多个区间组成一个时间窗口。
  4. 基于sentinel的动态限流方案

    • 数据统计:使用滑动窗口计数器算法统计当前的流量。
    • 规则管理:配置和管理限流规则,通过zk实现从后台到端上的同步。
    • 流量校验
      • 参数临界点:找到限流阈值优先级的临界点。
      • 细分窗口:将1s的窗口划分为N个更小的时间窗,近似计算1s的流量。
      • 动态预测:用最近1s已有的统计数据预测当前窗口的请求是否需要限流。
      • double check:使用细分窗口+动态预测方案,并通过check2保证被保护资源通过的总流量不超过阈值。
    • 整体架构:复用sentinel责任链+SPI架构,使用独立SDK打包方式嵌入动态限流模板。
    • 实现效果:通过监控查看各配置参数通过/拒绝的请求量,实现限流功能的可视化。
  5. 总结

    • 动态限流方案提供更细粒度、能够根据流量动态调整限流阈值的参数级限流方法,是对sentinel限流功能的补充和拓展。
    • 对比sentinel的QPS限流,动态限流方案提供了更细粒度的参数级别的限流。
    • 对比sentinel的热点参数限流,动态限流根据配置的参数优先级进行限流,限流的阈值参数会根据资源的流量动态调整,重点是“保核心”。