什么是舱壁隔离
舱壁隔离(Bulkhead)为不同调用、下游或租户分配独立资源池(线程、连接、队列、实例),让一组流量出问题时不会拖垮整体。名称来自船舶分舱:单个舱室进水不会导致整船沉没。它的本质是通过限制资源传导,把故障控制在局部,代价是资源利用率下降。
基本信息
| 隔离维度 | 按下游服务、业务等级、租户或接口类型划分资源池 |
|---|---|
| 隔离对象 | 线程池、连接池、信号量、队列、实例分组 |
| 容量口径 | 每池按峰值估算并预留缓冲,池满时快速失败而非排队 |
| 配套手段 | 熔断、超时、降级与监控按池独立设置 |
典型使用场景
- 主链路保护:下单支付的线程池与营销、推荐等旁路彻底分开
- 多下游隔离:为每个下游服务单独设连接池,单下游慢调用不占满全局
- 多租户隔离:大租户与普通租户资源分开,避免互相挤占
- 核心接口优先:核心查询保留专用池,非核心批量任务不得占用
- 灰度隔离:灰度实例与稳定实例分组,灰度出问题不影响主流量
- 异步任务隔离:消息消费线程池与同步接口线程池分开
隔离方式对比
| 方式 | 机制 | 代价 |
|---|---|---|
| 线程池隔离 | 每下游独立线程池,超时可控 | 线程切换开销,池数量多 |
| 信号量隔离 | 限制并发数,不额外建线程 | 无法对排队请求设超时 |
| 连接池隔离 | 按下游分配连接上限 | 连接总数受数据库上限约束 |
| 实例分组隔离 | 物理机或实例层面分开 | 资源利用率最低,成本最高 |
线程池隔离示例
线程池隔离示例
# 资源池划分(示意,数值需按实测峰值核算)
下单主链路池:core 20 / max 40 / queue 100 / 超时 800ms
营销旁路池: core 5 / max 10 / queue 20 / 超时 300ms
# 规则
- 按下游与业务等级划分资源池,池之间不共享线程
- 池满立即失败或降级,不排队拖垮整体
- 每个池独立设置超时、熔断与告警阈值
# 观测:按池看活跃线程、队列长度、拒绝次数与 P99 耗时隔离与利用率存在取舍:池越多越安全,但总体资源占用与线程数上升,通常按业务等级分 2 到 3 档即可,不必每个下游一池。
隔离池的排队必须设上限:无界队列会让失败被隐藏,请求越积越多,最终在池内整体超时。