舱壁隔离

为不同调用或租户分配独立资源池(线程、连接、队列),一组流量出问题不拖垮其他部分;命名来自船体分舱,本质是限制故障的资源传导。

什么是舱壁隔离

舱壁隔离(Bulkhead)为不同调用、下游或租户分配独立资源池(线程、连接、队列、实例),让一组流量出问题时不会拖垮整体。名称来自船舶分舱:单个舱室进水不会导致整船沉没。它的本质是通过限制资源传导,把故障控制在局部,代价是资源利用率下降。

基本信息

隔离维度按下游服务、业务等级、租户或接口类型划分资源池
隔离对象线程池、连接池、信号量、队列、实例分组
容量口径每池按峰值估算并预留缓冲,池满时快速失败而非排队
配套手段熔断、超时、降级与监控按池独立设置

典型使用场景

  • 主链路保护:下单支付的线程池与营销、推荐等旁路彻底分开
  • 多下游隔离:为每个下游服务单独设连接池,单下游慢调用不占满全局
  • 多租户隔离:大租户与普通租户资源分开,避免互相挤占
  • 核心接口优先:核心查询保留专用池,非核心批量任务不得占用
  • 灰度隔离:灰度实例与稳定实例分组,灰度出问题不影响主流量
  • 异步任务隔离:消息消费线程池与同步接口线程池分开

隔离方式对比

方式机制代价
线程池隔离每下游独立线程池,超时可控线程切换开销,池数量多
信号量隔离限制并发数,不额外建线程无法对排队请求设超时
连接池隔离按下游分配连接上限连接总数受数据库上限约束
实例分组隔离物理机或实例层面分开资源利用率最低,成本最高

线程池隔离示例

线程池隔离示例
# 资源池划分(示意,数值需按实测峰值核算)
下单主链路池:core 20 / max 40 / queue 100 / 超时 800ms
营销旁路池:  core 5  / max 10 / queue 20  / 超时 300ms
# 规则
- 按下游与业务等级划分资源池,池之间不共享线程
- 池满立即失败或降级,不排队拖垮整体
- 每个池独立设置超时、熔断与告警阈值
# 观测:按池看活跃线程、队列长度、拒绝次数与 P99 耗时
隔离与利用率存在取舍:池越多越安全,但总体资源占用与线程数上升,通常按业务等级分 2 到 3 档即可,不必每个下游一池。
隔离池的排队必须设上限:无界队列会让失败被隐藏,请求越积越多,最终在池内整体超时。

易错点

  • 所有调用共用线程池,一个慢依赖阻塞所有功能,故障扩散到全站
  • 隔离池过多且未做容量核算,资源被闲置,整体利用率明显下降
  • 池满后的行为未定义,请求排队到超时才失败,用户等待被拉长
  • 只隔离线程不隔离连接,下游连接池仍被单一慢调用占满

数据来源与参考

  • 《Release It!(第 2 版)》(Nygard)
  • Netflix Hystrix 文档:Isolation
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌