Sentinel 的热点参数限流(ParamFlow)是为了防止由于某个具体参数(如某个商品 ID、某个用户 ID)的突发高并发请求导致系统崩溃而设计的。 与 Sentinel 普通的基于资源的限流(使用滑动时间窗口 LeapArray)不同,热点参数限流在底层实现上有着显著的区别。它的核心实现原理可以概括为:LRU 缓存淘汰算法 + 令牌桶算法(动态计算)。 下面从核心组件、数据结构、算法细节等几个维度来深入剖析它的实现机制。 --- 1. 为什么不能用普通的滑动窗口? 如果使用普通的滑动窗口统计每个参数的 QPS,假设有一个接口带有 参数,系统里有千万级别的活跃用户,如果为每一个 都创建一个滑动窗口(LeapArray),会导致极其严重的内存溢出(OOM)。 因此,热点参数限流必须解决“无限的参数值空间”与“有限的内存资源”之间的矛盾。 2. 核心数据结构:LRU Map 为了解决内存问题,Sentinel 引入了 LRU(Least Recently Used,最近最少使用) 策略。 Sentinel 使用了 Google Guava 内部非常著名的 的变体()作为底层存储...