面试题答案
一键面试1. Hystrix 与 Sentinel 设计原则
Hystrix 设计原则
- 隔离:通过线程池隔离和信号量隔离两种方式,将不同服务调用分配到不同的资源池。例如,每个微服务调用对应一个独立线程池,当某个服务调用出现故障时,不会影响其他服务调用,避免故障扩散。
- 熔断:当服务调用失败率达到一定阈值(如失败率超过 50%),在一定时间窗口(如 10 秒)内,触发熔断机制,不再调用实际服务,直接返回失败结果,防止进一步资源浪费。
- 降级:当服务熔断或出现资源不足(如线程池满)时,启用降级逻辑,返回兜底数据,保证系统基本可用。
- 缓存:对一些频繁调用且数据相对稳定的服务调用结果进行缓存,减少实际调用次数,提高响应速度。
- 监控:实时收集服务调用的指标数据,如调用次数、成功次数、失败次数、平均响应时间等,用于判断服务健康状况及触发熔断等操作。
Sentinel 设计原则
- 流量控制:根据预设的流量规则,如 QPS(每秒查询率)、并发线程数等,对进入系统的流量进行控制,避免流量过大导致系统崩溃。例如,设置某个接口的 QPS 阈值为 100,当超过该阈值时进行流量控制。
- 熔断降级:基于响应时间、异常比例等指标,当服务出现不稳定状态时,触发熔断。与 Hystrix 不同的是,Sentinel 可以基于慢调用比例进行熔断。
- 系统自适应保护:根据系统的负载情况,如 CPU 使用率、内存使用率等,自动调整流量控制和熔断策略,确保系统整体稳定运行。
- 多样化的熔断策略:支持基于慢调用、异常比例、异常数等多种熔断策略,可根据不同业务场景灵活选择。
- 实时监控与控制台:提供实时的监控数据,通过控制台方便查看和管理系统的流量、熔断等状态,并动态调整规则。
2. 设计和实现有效的熔断与降级策略
定义熔断触发条件
- 基于失败率:在一定时间窗口(如 10 秒)内,如果服务调用的失败率超过某个阈值(如 50%),触发熔断。例如,Hystrix 可以通过配置
circuitBreaker.errorThresholdPercentage
来设置失败率阈值。 - 基于响应时间:当服务的平均响应时间超过一定阈值(如 500 毫秒),并且在一定时间窗口内达到一定调用次数(如 100 次),触发熔断。Sentinel 可通过设置慢调用比例和慢调用响应时间阈值来实现。
- 基于异常数:在一定时间窗口内,服务调用产生的异常数量达到某个阈值(如 20 次),触发熔断。
服务降级
- 返回兜底数据:例如,在电商系统中,当商品详情服务不可用时,返回默认的商品描述信息,告知用户商品信息暂时无法获取。
- 返回友好提示:如“服务暂时不可用,请稍后重试”,给用户明确的反馈。
- 执行备用逻辑:在订单服务中,当主支付接口不可用时,切换到备用支付接口进行支付。
熔断后的恢复
- Hystrix:在熔断开启一段时间(如 5 秒,可通过
circuitBreaker.sleepWindowInMilliseconds
配置)后,进入半熔断状态,尝试少量请求调用实际服务。如果这些请求成功比例达到一定阈值(如 50%),则关闭熔断,恢复正常调用;否则,继续保持熔断状态。 - Sentinel:当熔断触发后,经过一定的熔断时长(可配置),尝试恢复对服务的调用。如果调用成功,则恢复正常;若再次失败,重新进入熔断状态。可通过控制台动态调整熔断恢复相关参数。