Hystrix 和 Sentinel 的区别?

#Java#面试八股

Hystrix 和 Sentinel 的区别?

结论先行:Hystrix 是 Netflix 的命令模式熔断器,靠线程池/信号量隔离实现舱壁,已停止维护;Sentinel 是阿里的流量治理组件,以「资源」为中心,提供限流、熔断、系统自适应保护、热点参数限流,规则可动态推送,且客户端轻量(无额外线程池)。新项目应选 Sentinel 或 Resilience4j。

1. 设计模型差异

Hystrix:
  调用方 → HystrixCommand → 线程池/信号量隔离 → 目标服务
  每个依赖一个线程池,超时由线程池 + Future.get 控制

Sentinel:
  调用方 → SphU.entry(resource) / @SentinelResource → 目标服务
  统计(滑动窗口)+ 规则判断,命中则 block,不额外创建线程

Hystrix 的线程池隔离像「每个下游一个专属泳道」,代价是线程数多、上下文切换开销大;Sentinel 在调用线程内做统计与判定,隔离靠「信号量式」的并发数/线程数限流规则。

2. 能力对比

维度HystrixSentinel
维护状态2018 起停止开发,官方推荐替代活跃
隔离方式线程池(默认)/ 信号量并发线程数、QPS 控制(无额外线程池)
熔断基于滑动窗口错误率慢调用比例、异常比例、异常数
限流无原生 QPS 限流QPS/线程数、匀速排队、热点参数、集群限流
系统保护无系统自适应(Load/CPU/RT/线程数)
规则配置代码/配置文件,动态改需 Archaius控制台 + Nacos/ZK 动态推送
监控Hystrix Dashboard + TurbineSentinel Dashboard + 实时指标
侵入性@HystrixCommand 或继承 Command@SentinelResource 或 SphU.entry
生态Spring Cloud Netflix(已停更)Spring Cloud Alibaba

3. 代码对照

Hystrix(历史写法):

@HystrixCommand(
    fallbackMethod = "fallback",
    commandProperties = {
        @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1000"),
        @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "50")
    })
public StockDTO getStock(Long skuId) {
    return stockClient.get(skuId);
}

public StockDTO fallback(Long skuId) {
    return StockDTO.empty(skuId);            // 降级返回值
}

Sentinel:

@SentinelResource(value = "getStock", blockHandler = "blocked", fallback = "fallback")
public StockDTO getStock(Long skuId) {
    return stockClient.get(skuId);
}

// 被流控/熔断规则拦截时进入这里
public StockDTO blocked(Long skuId, BlockException ex) {
    return StockDTO.empty(skuId);
}

// 业务异常时进入这里(可区分异常类型)
public StockDTO fallback(Long skuId, Throwable t) {
    return StockDTO.empty(skuId);
}

注意 blockHandler 与 fallback 的分工:前者处理规则拦截,后者处理业务异常,签名必须与原方法一致(可多一个 BlockException/Throwable 参数)。

4. 规则配置

spring:
  cloud:
    sentinel:
      transport:
        dashboard: 127.0.0.1:8858
      eager: true                 # 启动即建立心跳,避免首次访问才注册
      datasource:
        flow:
          nacos:
            server-addr: 127.0.0.1:8848
            data-id: order-flow-rules
            group-id: SENTINEL_GROUP
            rule-type: flow        # flow/degrade/system/param-flow
[
  {
    "resource": "getStock",
    "grade": 1,
    "count": 100,
    "strategy": 0,
    "controlBehavior": 0
  }
]

grade:0=线程数,1=QPS;strategy:0=直接,1=关联,2=链路;controlBehavior:0=快速失败,1=Warm Up,2=匀速排队。

5. 熔断参数怎么定

参数含义建议
grade熔断策略慢调用比例 / 异常比例 / 异常数
count(慢调用 RT)超过该 RT 记为慢调用设为 P99 的 1.5~2 倍
slowRatioThreshold慢调用比例阈值0.5 左右
statIntervalMs统计窗口1000~10000ms
minRequestAmount最小请求数避免低流量误熔断
timeWindow熔断时长5~30s,太长会拖慢恢复

6. 常见追问

追问一:Sentinel 为什么不用线程池隔离? 线程池隔离会增加线程数与上下文切换,Sentinel 选择在调用线程内统计并用「并发线程数」规则限流,效果接近信号量隔离。需要严格隔离时,可以配 grade=0(线程数)规则。

追问二:blockHandler 和 fallback 能同时生效吗? 能。规则拦截走 blockHandler,业务异常走 fallback;若 fallback 里再抛异常,会继续向上抛,不会二次降级。

追问三:规则丢了怎么办? Sentinel Dashboard 默认把规则存在内存,重启即丢。生产必须接 Nacos/ZK 做持久化(datasource 配置),并开启 eager 让客户端启动即拉取规则。

追问四:Sentinel 能保护非 Web 方法吗? 能。@SentinelResource 加在任意 Spring Bean 方法上即可,资源名默认是方法签名,也可显式指定。这也是它比 Hystrix 灵活的地方。

追问五:Hystrix 还有必要学吗? 作为演进史值得了解:线程池隔离、舱壁模式、fallback 这些概念被 Sentinel/Resilience4j 继承。但新项目不应再引入。

小结

Hystrix 的核心是「命令 + 线程池隔离 + 熔断」,Sentinel 的核心是「资源 + 滑动窗口统计 + 多维规则」。前者用资源换隔离,后者用统计换轻量;再加上动态规则与系统自适应保护,Sentinel 更贴合当下微服务的治理需求。

笔记加载中…