1. @Bulkhead(信号量隔离/线程池隔离)
请解释 Resilience4j 的 @Bulkhead(信号量隔离/线程池隔离)机制?
- Bulkhead 的两种隔离
- 信号量隔离与线程池隔离
- 并发控制与失败快速失败
Resilience4j 的 @Bulkhead(舱壁隔离)用于隔离故障,防止一个依赖的故障拖垮整个系统,通过限制对该依赖的并发调用数实现。它有两种实现:信号量隔离(SemaphoreBulkhead)——用 Semaphore 限制同时执行的调用数,不额外创建线程,主线程执行,开销小、适合同步调用;当并发超过限制时,后续调用快速失败或排队。线程池隔离(ThreadPoolBulkhead)——用独立线程池执行调用,每个依赖有独立线程池,通过线程池大小限制并发,超出的调用丢入队列或拒绝,适合异步/阻塞调用,隔离更彻底(线程池耗尽不影响其他依赖),但开销更大。配置参数:maxConcurrentCalls(信号量)或 maxThreadPoolSize(线程池)、maxWaitDuration(等待时间)、queueCapacity(队列容量)等。@Bulkhead 注解应用于方法,配合限流保护依赖。选择:同步、低开销用信号量;异步、需要彻底隔离用线程池。
Bulkhead 的核心是"隔离"——用并发上限把故障限制在单个依赖内。信号量隔离省资源,线程池隔离更彻底,根据调用类型(同步/异步)与隔离需求选择。它是舰船级的"舱壁"思想。