Hystrix、Resilience4j、隔离与熔断面试题
本页只放标准回答、追问和原理跳转。
1. HystrixCommand一次执行怎样走
标准回答: 先检查请求缓存和Circuit是否放行,再获取线程池或信号量隔离容量;执行run/construct后按成功、失败、超时、拒绝记录不同事件;异常进入受保护Fallback,Fallback失败则抛最终异常。短路、拒绝、超时和执行失败必须分开监控。
原理:Hystrix执行链
2. 线程池隔离和信号量隔离有什么区别
标准回答: 线程池把下游执行放到专用工作线程,能限制慢调用占用范围但有调度和上下文传播成本;信号量只限制并发,仍在调用线程执行,开销低但下游阻塞会占住入口线程。两者都不能替代HTTP/JDBC客户端超时。
3. Hystrix超时后底层调用一定停止吗
标准回答: 不一定。Hystrix可发出中断或停止等待,但Socket、JDBC和第三方库可能忽略中断,任务仍占线程和连接。必须配置底层Connect/Read/Query Timeout,写请求还要幂等和结果查询。
原理:线程池超时边界
4. Hystrix熔断器怎样打开
标准回答: 在滚动窗口请求量达到VolumeThreshold后,错误百分比超过阈值才打开;经过SleepWindow允许试探,成功关闭、失败继续打开。请求量门槛避免低流量的一次失败直接变成100%熔断。
5. 为什么不建议把队列配置很大
标准回答: 大队列不增加下游吞吐,只让请求排队并在Deadline过期后才执行,增加内存和尾延迟。应按到达率和服务时间估算并发,使用小队列、快速拒绝、Fallback和上游限流。
原理:线程池与队列
6. Fallback应该怎样设计
标准回答: Fallback必须简单、快速、少依赖并保持业务语义。推荐失败可返回空推荐,权限校验不能默认放行,库存超时不能返回无库存或扣减成功。响应应保留降级标志和可追踪错误码。
原理:Fallback边界
7. Resilience4j CircuitBreaker会自动超时和隔离吗
标准回答: 不会。CircuitBreaker只统计结果并决定放行;Timeout使用TimeLimiter和底层客户端超时,并发隔离使用Semaphore/ThreadPoolBulkhead,Retry和RateLimiter也是独立模块。需要显式组合并验证顺序。
8. Retry和CircuitBreaker顺序为什么重要
标准回答: Retry包在CircuitBreaker外时,每次Attempt可能分别进入熔断统计;CircuitBreaker包在Retry外时,可能只记录整组重试最终结果。注解Aspect顺序受框架配置影响,关键链路应通过集成测试和Metrics证明。
原理:装饰器顺序
9. TimeLimiter超时后业务会自动回滚吗
标准回答: 不会。TimeLimiter限制等待Future/CompletionStage,取消也不保证底层I/O停止,更不会撤销已提交事务。仍需要客户端超时、幂等键和事实查询。
10. Hystrix怎样迁移到Resilience4j
标准回答: 先记录旧Command、ThreadPool、Timeout、错误分类、Fallback和Metrics基线;按下游映射到CircuitBreaker、Bulkhead、TimeLimiter、Retry;一次只迁一个故障域,灰度比较物理Attempt、P99、拒绝、降级、线程和连接池,保留快速回滚。
原理:迁移映射
11. 为什么Boot 3项目不能继续照抄@HystrixCommand
标准回答: Hystrix属于Spring Cloud Netflix历史体系,现代Boot 3项目应先按Boot、Cloud Release Train和组件兼容矩阵确定依赖,再使用Spring Cloud CircuitBreaker、Resilience4j、Sentinel或平台治理能力。迁移不是换一个注解:必须重新确认超时、隔离、统计口径、Fallback、指标和取消边界。
12. Java 17有虚拟线程后还需要Bulkhead吗
标准回答: Java 17没有正式虚拟线程,虚拟线程在Java 21正式发布。即使升级到Java 21,数据库连接、HTTP连接、CPU、锁和下游配额仍是有限资源,因此仍需要并发隔离、超时和背压;虚拟线程只改变阻塞线程成本,不会提高下游容量。
13. 熔断和Fallback突然激增怎样排查
标准回答: 先按实例和Command拆分Failure、Timeout、ShortCircuit、Thread/SemaphoreRejected和FallbackFailure;再查QPS、下游P99、线程/队列/连接池、Timeout后残留任务、Fallback依赖和多层Retry,不能只调大熔断阈值。
原理:生产Runbook
