这些都是服务稳定性保障的核心技术,核心结论是:线程隔离解决“局部故障扩散”,流量控制算法(滑动窗口、漏桶)限制“过载请求”,雪花算法保障“分布式唯一ID”。

一、线程隔离:隔离故障,避免雪崩

线程隔离是将不同服务/接口的请求处理线程分开,防止单个模块故障拖垮整个应用,主要有两种实现方式:

  • 线程池隔离(Hystix默认采用):为每个服务分配独立线程池,线程池耗尽仅影响该服务,不波及其他模块。线程会带来额外的CPU开销,性能一般,但隔离性强
  • 信号量隔离(Sentinel默认采用):不创建独立线程池,通过信号量控制并发请求数,超出阈值直接拒绝,资源消耗更低,性能较好,但隔离性一般。

二、滑动窗口计数算法:精准限流,平滑统计

核心是“基于时间窗口的请求计数”,用于接口限流场景:

  • 把时间划分为固定大小的“窗口”(如1秒),窗口内请求数超阈值则限流。
  • 窗口随时间“滑动”,每过一个小时间片(如100毫秒)更新窗口数据,避免固定窗口的临界突发问题。
  • 窗口会根据当前请求所在时间(currentTime)移动,窗口范围从(currentTime - 窗口时间跨度Interval)之后的第一个时区开始,到currentTime所在时区结束。

三、漏桶算法:平稳流出,控制速率

核心是“以固定速率处理请求”,解决流量突发冲击问题:

  • 请求像水流注入漏桶,漏桶以固定速率“漏水”(处理请求)。
  • 桶满后新请求直接丢弃或排队,确保服务处理压力稳定,不被突发流量击垮。
  • Sentinel内部基于漏桶算法实现排队等待效果,桶的容量取决于限流的QPS阈值以及运行等待的最大超时时间。

四、令牌桶算法:灵活限流,适配流量波动

核心是“令牌驱动请求执行”,平衡流量控制与资源利用率:

  • 系统按固定速率生成令牌存入桶中(桶有最大容量),请求需获取令牌才能执行。
  • 支持突发流量(桶内积累的令牌可应对峰值),同时通过令牌生成速率控制长期平均流量。
  • 适用于:热点参数限流。对单个参数做限流,或多个参数不同限流规则。

Sentinel限流和Gateway的限流有什么差别

限流算法常见有三种实现:滑动时间窗口、令牌桶算法、漏桶算法。Gateway采用基于Redis实现令牌桶算法,而Sentinel内部比较复杂:

  • 默认限流模式是基于滑动时间窗口算法,另外Sentinel中断路器的计数也是基于滑动时间窗口算法。
  • 限流后可以快速失败和排队等待,其中排队等待基于漏桶算法。
  • 而热点参数限流则是基于令牌桶算法。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐