一句话定义
舱壁隔离(Bulkhead)是一种容错设计:把线程、连接、并发额度、GPU 时长这类资源按功能或租户切成若干互不连通的小池子,任何一个池子被耗尽,都不会波及其他池子。
名字来自船体
货轮的船体被一道道水密舱壁分成许多隔舱。某段船壳破了,海水只灌满那一个舱,船整体还浮着,能开回港口。软件里的舱壁是同一思路:不指望每个功能都不出错,只保证出错时损失被关在一个舱里。
一个具体的翻车现场
某个 LLM 应用的核心是对话,边上还挂着「一键生成周报」「导出全量数据」「后台重跑评测集」。如果这些功能共用一个模型 API 的并发配额、一个数据库连接池,那么某位用户点了全量导出,长事务把连接占满;或者批处理把并发打满,核心对话就开始超时。日志上写的是「导出功能的 bug」,用户感受到的却是「整个产品挂了」。舱壁隔离要解决的就是这个错位。
怎么切
常见的切分维度有四种:按功能(核心对话链路 vs 周边工具)、按租户(免费用户 vs 大客户)、按下游依赖(每个外部服务各自的连接池)、按优先级(可降级的活丢进异步队列)。实现可以从轻到重:进程内给不同接口配独立的信号量和队列;或者独立部署、独立命名空间,用 Kubernetes 的 resource requests/limits 和配额做硬边界。共享底层资源时,用配额(quota)代替抢占;具体行为和字段以官方文档为准。
和相邻概念的区别
| 概念 | 主要管什么 | 出手时机 |
|---|---|---|
| 舱壁隔离 | 资源分池,限定每类功能最多能用多少 | 事前,常驻生效 |
| 限流(Rate Limiting) | 控制进入系统的请求速率 | 事前,卡在入口 |
| 熔断(Circuit Breaker) | 下游持续失败时直接拒绝,不再空等 | 事中到事后 |
| 超时(Timeout) | 单次调用最多等多久 | 事中 |
限流管「进来多少」,超时管「等多久」,熔断管「还调不调」,舱壁隔离管「谁能用哪部分资源」。四者常一起用,但只有舱壁隔离能阻止一个功能把公共资源吃光。
对从业者的实际意义
隔离换来的是稳定性,付出的是利用率:池子分开后不能互相借资源,峰值时可能一边闲着、一边排队。所以关键是分级,不是平均分——核心链路给足,次要功能允许排队、降级、异步化。划分粒度按「故障爆炸半径」来定,而不是按代码模块来定。设计时问自己一句:如果这个功能明天被一个用户疯狂点击,谁会跟着一起倒?那些会一起倒的东西,就该被舱壁隔开。
