Skip to content

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%熔断。

原理:Rolling Metrics

5. 为什么不建议把队列配置很大

标准回答: 大队列不增加下游吞吐,只让请求排队并在Deadline过期后才执行,增加内存和尾延迟。应按到达率和服务时间估算并发,使用小队列、快速拒绝、Fallback和上游限流。

原理:线程池与队列

6. Fallback应该怎样设计

标准回答: Fallback必须简单、快速、少依赖并保持业务语义。推荐失败可返回空推荐,权限校验不能默认放行,库存超时不能返回无库存或扣减成功。响应应保留降级标志和可追踪错误码。

原理:Fallback边界

7. Resilience4j CircuitBreaker会自动超时和隔离吗

标准回答: 不会。CircuitBreaker只统计结果并决定放行;Timeout使用TimeLimiter和底层客户端超时,并发隔离使用Semaphore/ThreadPoolBulkhead,Retry和RateLimiter也是独立模块。需要显式组合并验证顺序。

原理:Resilience4j模块

8. Retry和CircuitBreaker顺序为什么重要

标准回答: Retry包在CircuitBreaker外时,每次Attempt可能分别进入熔断统计;CircuitBreaker包在Retry外时,可能只记录整组重试最终结果。注解Aspect顺序受框架配置影响,关键链路应通过集成测试和Metrics证明。

原理:装饰器顺序

9. TimeLimiter超时后业务会自动回滚吗

标准回答: 不会。TimeLimiter限制等待Future/CompletionStage,取消也不保证底层I/O停止,更不会撤销已提交事务。仍需要客户端超时、幂等键和事实查询。

原理:TimeLimiter边界

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、指标和取消边界。

原理:Java 17+、Boot 3现代实现迁移映射

12. Java 17有虚拟线程后还需要Bulkhead吗

标准回答: Java 17没有正式虚拟线程,虚拟线程在Java 21正式发布。即使升级到Java 21,数据库连接、HTTP连接、CPU、锁和下游配额仍是有限资源,因此仍需要并发隔离、超时和背压;虚拟线程只改变阻塞线程成本,不会提高下游容量。

原理:TimeLimiter与取消边界现代调用链

13. 熔断和Fallback突然激增怎样排查

标准回答: 先按实例和Command拆分Failure、Timeout、ShortCircuit、Thread/SemaphoreRejected和FallbackFailure;再查QPS、下游P99、线程/队列/连接池、Timeout后残留任务、Fallback依赖和多层Retry,不能只调大熔断阈值。

原理:生产Runbook