想象你走进一家大型综合医院。如果所有病人都挤在同一个大厅排队——外科抢救的病人堵在大门口、内科开药的病人挤在过道、儿科发热的娃娃在角落哭闹——那么一个紧急手术就会让整个医院瘫痪。所以,真正的医院一定为每个科室设立了独立的挂号和候诊区域:外科急诊爆满时,儿科门诊依然能正常接诊。这就是“隔离”的朴素直觉。 在分布式系统里,服务器就是医院,各种业务请求就像不同科室的病人。一台服务器内部的线程,承担了外科、内科、儿科的任务却没有任何分隔,一旦某个慢接口把线程全部堵死,其他业务的请求也只能在队列里绝望地排队等待超时——这就是著名的“故障扩散”(雪崩效应的前奏)。为了让故障不至于炸掉整个系统,架构师的办法和医院一样:给不同的业务建立独立的“科室区域”。隔离有三个层次的方案:线程池隔离(独立科室挂号和候诊)、进程/舱壁隔离(独立病区大楼)、集群隔离(城市里分布多家医院)。本文就用这家“医院”作为主线,带你理解如何通过隔离把故障关进“笼子”里。

岗位关联

隔离设计是后端架构师与分布式系统工程师从“能写代码”进阶到“能扛故障”的分水岭。读透本文,你能把“高可用”从一句口号,变成可量化、可落地的架构边界设计。

目录
  1. 可视化演示
  2. 一、隔离核心思想:给故障建“笼子”
  3. 二、线程池隔离:医院里的“分科室挂号”
  4. 三、舱壁模式:船舱分隔的艺术
  5. 四、集群隔离:把鸡蛋分开装在多个篮子里
  6. 五、隔离粒度权衡:不是越细越好
  7. 六、治理与演进:让隔离真正落地
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示三级隔离层级对比、舱壁模式资源池隔离及故障扩散控制效果,交互切换理解高可用隔离核心设计原理。

本节配有交互动效(进入视口后自动加载,约 3KB)。

'+modeData.levels.caption+'

一、隔离核心思想:给故障建“笼子”

医院的感染科有个铁律:疑似传染病人不能待在普通候诊室,必须进入负压隔离病房。隔离病房的意义不是直接治好病人,而是确保疾病不会传染给其他患者。系统架构中的“隔离”思想完全同构——我们无法预测哪个服务会出故障,但可以在故障发生前就安排好“病房”,让故障的破坏力被锁死在特定范围内,这就是故障隔离边界。

一个慢 SQL 拖垮数据库连接池,数据库连接池被耗尽导致所有依赖数据库的接口超时,接口超时又占满了上层服务的线程池,上层服务随之雪崩——这就是典型的故障扩散。故障扩散是分布式系统最常见的死法,而隔离的本质,就是把资源(线程、进程、集群)划分到彼此独立的“笼子”里。进程内存隔离靠操作系统保证,线程间隔离则依赖架构师主动设计。无论哪种层次,核心都是控制“故障扩散系数”。

为了定量理解隔离的价值,我们用故障影响度公式来衡量整个系统的受损比例:

I=Nf×BNt\displaystyle I = \frac{N_f \times B}{N_t}

1. 故障节点数 NfN_f:它代表故障直接摧毁的节点数量,比如某个线程池中被阻塞堆积的任务数,或某台宕机的服务器。

Nf\displaystyle N_f

2. 扩散系数 BB:介于 0 到 1 之间。B=1B=1 表示所有资源完全共享、毫无隔离,故障可以一路传染;B=0B=0 表示完全隔离,故障被牢牢困住。

B\displaystyle B

3. 总节点数 NtN_t:系统承载业务的所有节点总和,例如所有线程池的综合处理能力,或全部集群的实例数。

Nt\displaystyle N_t

4. 故障影响度 II:最终计算出的整体受损比例。II 越接近 0,说明系统越健壮;越接近 1,说明故障已经全面失控。

I\displaystyle I

医院的负压隔离病房就是那个让 BB 趋近于 0 的“门”。有门,疾病不传出去,其他人正常工作;没门,全院感染。明白了这个公式,我们就知道隔离的本质是在压缩扩散系数——接下来讲的所有策略,都是在给系统装“门”。

二、线程池隔离:医院里的“分科室挂号”

一家医院如果真的只有一个大厅排队,最直接的改进是什么?分科室挂号:外科、内科、儿科各有独立的挂号窗口和候诊区。外科急诊被抢救病人堵住时,内科的慢性病人依然能按时取药,互不耽误。这就是线程池隔离的最朴素版本。

在代码层面,很多系统最初的病根是“所有业务共用一个全局线程池”。订单、支付、库存、用户……所有接口都往里丢任务。一旦某个第三方依赖变慢,这个公共池的线程全被占住,所有业务一起超时。线程池隔离的做法,就是为每个业务模块分配独立的线程池:订单模块一个 20 线程的池,支付模块一个 10 线程的池,库存模块一个 15 线程的池,各自维护独立的阻塞队列。每个科室的医生团队各管各的病人。

但独立线程池只解决了“排队分开”的问题,还要防止“医生被一个病人缠住不放”。此时就需要信号量限流——好比医院给每个诊室门口装了闸机,同时最多放行 5 个病人进入候诊,多出来的病人直接改约(快速失败或降级)。线程池大小与信号量配额共同构成并发双闸门:

C=min⁡(S,Q)\displaystyle C = \min(S, Q)

1. 线程池大小 SS:这个科室最多配置多少名“医生”(工作线程),决定了同时能处理多少任务。

S\displaystyle S

2. 信号量配额 QQ:诊室门口闸机允许同时进入的最大病人数,即使线程还有空闲,超过配额的请求也直接拒绝。

Q\displaystyle Q

3. 实际并发 CC:取两者的最小值。SS 负责防止线程被无限创建,QQ 负责防止请求洪峰打穿系统,两者缺一不可。

C=min⁡(S,Q)\displaystyle C = \min(S, Q)

回到我们的医院比喻:线程池隔离让每个科室有了独立的医生团队(线程)和候诊区(队列),信号量则保证候诊区不会涌入超出承载能力的病人。这一层的隔离成本低、见效快,是每一个高并发系统都应该优先做的“分科挂号”。

三、舱壁模式:船舱分隔的艺术

泰坦尼克号曾被称为“永不沉没”——不是因为船体钢材多厚,而是因为船底被 16 个水密隔舱分成棋格状,理论上一个或两个舱进水,船依然能浮在水面上。这种“把一个整体分成若干彼此独立且密封的空间”的设计,就是舱壁模式(Bulkhead Pattern)的来历。

线程池隔离解决的是“同一进程内不同业务的排队冲突”,但现实中系统经常要面对另一种风险:某一次外部依赖调用特别慢,或者某个基础中间件的连接突然全部超时。此时即便业务分池,池内任务依然会大量堆积。舱壁模式要求我们按“依赖”而非仅按“业务”来划分资源——核心支付链路用一套线程池,非核心报表链路用另一套,访问第三方支付网关的请求单独设一个信号量池。船底每一个分舱都有独立的阀门口。

舱壁模式的关键在于三个设计原则:第一,资源池必须完全独立,不共享任何线程、队列或连接;第二,每个舱要有明确的水位线,即舱内排队长度与池容量的比值;第三,当舱内水位过高时要有逃生通道,也就是降级与兜底策略。舱内水位公式很好理解:排队任务数除以线程数,超过 1 就说明舱在进水。

L=LqSp\displaystyle L = \frac{L_q}{S_p}

1. 排队任务数 LqL_q:等待被线程处理的任务数量,相当于候诊室里等候的病人数。

Lq\displaystyle L_q

2. 线程池容量 SpS_p:这个隔舱同时能处理的任务数,即“医生团队”的人数上限。

Sp\displaystyle S_p

3. 水位 LL:L=1L = 1 时舱刚好满员;L>1L > 1 时舱内进水,必须触发丢弃、降级或熔断等兜底策略,确保舱壁不被压裂。

L=LqSp\displaystyle L = \frac{L_q}{S_p}

舱壁模式教会我们,隔离不只是“分开”,还要“各自有逃生路线”。就像泰坦尼克号每个水密隔舱都设计为可独立密封,每个资源舱都必须具备快速失败的兜底能力——降级返回缓存结果、丢弃低优先级请求,都能为系统赢得宝贵的恢复时间。

四、集群隔离:把鸡蛋分开装在多个篮子里

一座城市如果只有一家超级医院,遭遇火灾、断电或疫情时,全城医疗瞬间崩溃。城市规划者会做的选择是:在不同城区建多家规模适中的医院,各自配备独立的电力、血库和药品供应链。这就是集群隔离的智慧——把鸡蛋分装在不同的篮子里,一个篮子摔了还有别的。

集群隔离是三个层次中爆炸半径最大的保险。它不再局限于单台服务器内部的线程,而是把整个服务部署到多个独立集群中,每个集群有独立的资源额度、独立的配置中心、独立的数据库实例,甚至分属不同的机房和可用区。当集群 A 因某种原因整体故障时,流量路由层通过健康检查感知异常,将请求自动切换到集群 B——这个过程叫做故障域名切换:DNS 把访问域名解析到备用集群的入口,就像救护车司机看到医院 A 门口拉起警戒线,立刻调头驶向医院 B。

集群隔离要真正生效,必须确保故障域完全不重叠:如果 A、B 两个集群部署在同一物理机房、共用同一路电源,停电时照样一起阵亡。真正的集群隔离要求物理环境层面也独立——不同机架、不同机房、不同可用区。我们用冗余容量公式描述集群的可用程度:

A=1−NaNt\displaystyle A = 1 - \frac{N_a}{N_t}

1. 活跃节点数 NaN_a:当前正在承接真实流量的节点数。如果全部节点都在满负荷运转,就毫无冗余。

Na\displaystyle N_a

2. 总节点数 NtN_t:集群中所有可用节点的总数,包括平时闲置的备援节点。

Nt\displaystyle N_t

3. 可用性 AA:AA 越接近 1,说明冗余越充足;若 A=0A = 0,意味着没有备份,任何一个节点宕机都会导致服务降级。

A=1−NaNt\displaystyle A = 1 - \frac{N_a}{N_t}

回到医院比喻:多院区策略的核心目标是——“单点故障不可能拖垮全城”。每增加一个独立集群,就等于为城市多建了一家医院。成本虽高,但对于核心业务而言,这是保障大规模系统整体可用性的最后一道防线,也是异地多活架构的基础能力。

五、隔离粒度权衡:不是越细越好

医院如果给每一个病床都建独立的负压隔离室,看似隔离做到了极致,实际上耗尽了预算、耗尽了护士的精力,连正常的查房效率都保不住。隔离粒度从来不是越细越好——这是一门平衡的艺术。

线程池隔离粒度最细,按业务模块划分,故障边界小、实施成本低,但过度切分会导致资源利用率下降:一个模块闲得发慌,另一个模块排队到爆炸,资源无法互相借用。舱壁模式按依赖或优先级划分,粒度居中,能够精细地保护关键链路,但需要为每个舱配置独立的限流、降级预案,运维复杂度显著上升。集群隔离粒度最粗,故障边界最大,能够抵御机房级灾难,但硬件成本高昂,且集群间的数据同步与流量调度本身也是技术挑战。

三种粒度的效果可以用隔离收益公式来评估:隔离带来的收益,正比于“隔离前后扩散系数的差值”。如果某个场景本来就不容易出现故障扩散,花大力气做细粒度隔离就是浪费;反之,如果故障扩散会造成巨额损失,粗粒度的隔离反而显得不够。

E=Nf×(Bs−Bi)Nt\displaystyle E = \frac{N_f \times (B_s - B_i)}{N_t}

1. 共享时扩散系数 BsB_s:未做隔离时,故障向邻居传播的概率,比如公共线程池中慢任务占用所有线程。

Bs\displaystyle B_s

2. 隔离后扩散系数 BiB_i:实施隔离后,故障被限制在单舱内,此值大幅降低。

Bi\displaystyle B_i

3. 净收益 EE:EE 越大,说明隔离措施带来的稳定性回报越高。选型时,优先在 EE 大的链路投入隔离成本。

E=Nf×(Bs−Bi)Nt\displaystyle E = \frac{N_f \times (B_s - B_i)}{N_t}

好的架构师就像一位精明的医院院长:为传染科建负压病房,但不给普通感冒患者也安排单间。低延迟高并发的核心链路,采用线程池隔离;依赖繁多、容易互相拖累的服务,采用信号量舱壁;资金与体量允许的核心业务,再叠加集群隔离。先算清楚收益,再决定花多少成本。

六、治理与演进:让隔离真正落地

隔离病房建好之后,如果护士不去巡查体温、不做消毒记录、不检查负压设备,时间一长,病房就跟普通房间没有区别。静态的隔离设计,必须配合动态的治理手段才能持续生效。

首先是熔断与监控。熔断器就像是病房门口的自动化监测仪:当某个舱的失败率连续超过阈值,熔断器自动打开,阻止所有请求继续涌入这个故障舱,让舱内慢慢恢复;经过一段冷却时间后,再放少量试探请求(半开状态),确认好转才完全关闭熔断。监控则持续采集每个舱的水位、延迟、错误率,一旦发现舱内异常就报警。隔离给了系统“分区”的能力,熔断监控才是那个“发现哪个舱漏了水”的哨兵。

其次是故障演练。真正可靠的隔离边界必须经过实战检验。混沌工程的做法是定期在某个舱内人为注入故障——关掉一台机器、模拟海量请求冲击、杀掉数据库连接——然后观察故障是否真的被限制在舱内。这与消防演习同理:大楼的防火门是否真的能挡住浓烟,不能等火灾来了才知道。

最后是容量规划。每个隔离舱都要有明确的容量预算:这个舱的线程池为什么是 20 不是 50?压测数据是什么?大促流量翻三倍时哪个舱先爆?用覆盖度公式来评估治理的完备率:

D=NcNd\displaystyle D = \frac{N_c}{N_d}

1. 已保护依赖数 NcN_c:已经配置了线程池隔离、熔断或信号量等保护措施的关键依赖数量。

Nc\displaystyle N_c

2. 全部依赖数 NdN_d:这个服务运行时依赖的所有下游组件数量,包括数据库、缓存、第三方 API 等。

Nd\displaystyle N_d

3. 覆盖度 DD:D=1D = 1 说明所有依赖都有隔离兜底;D<0.5D < 0.5 则说明隔离体系形同虚设,大多数舱壁只是画在纸上的图纸。

D=NcNd\displaystyle D = \frac{N_c}{N_d}

回顾整条主线:我们从医院的分科室挂号开始,给线程池装上了隔断;接着借鉴泰坦尼克号的水密舱,引入了架构级的舱壁模式;然后走到城市层面,用多院区实现了集群隔离;最后回到医院院长视角,用巡检、演习和预算让隔离真正活起来。一家从“分科室”到“多院区”再到“严格院感巡查”的医院,才是一座真正高可用的医院。

AI 应用场景

场景一:电商大促的“支付舱壁”

阶段:高并发系统架构设计

解决的问题:每年双 11 大促时,支付网关偶尔会因银行通道抖动出现慢调用。传统做法是所有业务共用一个 RPC 线程池,支付慢调用会迅速占满线程池,导致商品详情、购物车等接口全部超时,整站雪崩。通过线程池隔离 + 信号量舱壁,把支付请求放进独立线程池并限制并发配额,支付舱堵塞时其他舱照常服务,买家的浏览和下单体验不受影响。

具体案例:某头部电商平台在支付链路配置了独立的 20 线程池与 100 信号量配额。双 11 当天银行通道 30% 请求慢至 5 秒,支付舱水位飙升至 3,触发熔断降级;但商品详情、库存查询等舱位正常,整站未发生雪崩,最终挽救了数亿 GMV。

场景二:微服务团队的“多集群故障切换”

阶段:分布式系统容灾设计

解决的问题:核心订单服务单集群部署在同一机房,机房光缆被挖断即全站瘫痪。通过集群隔离,将订单服务部署在两个不同可用区的独立 K8s 集群中,配合 DNS 故障域名切换,A 集群失联后外部流量自动切入 B 集群。

具体案例:某金融科技公司将核心交易集群拆分到 A、B 两个可用区,两套集群完全独立,包括数据库主从、缓存集群与配置中心。某一日 A 可用区因云厂商故障整体宕机,B 集群在 30 秒内承接全部流量,全程零交易丢失。

Python 演示

python59 行
import timefrom concurrent.futures import ThreadPoolExecutor, as_completed  def slow_task(group, name, sec):    time.sleep(sec)    return group + ":" + name  def run_shared_pool(jobs):    # 无隔离:所有任务共用一个 2 线程池    with ThreadPoolExecutor(max_workers=2) as pool:        futures = [pool.submit(slow_task, j["group"], j["name"], j["sec"])                   for j in jobs]        done = 0        for f in as_completed(futures):            if f.result():                done += 1        return done  def run_isolated_pool(jobs):    # 舱壁隔离:体检科与门诊科各用独立线程池    pools = {        "examine": ThreadPoolExecutor(max_workers=2),        "clinic": ThreadPoolExecutor(max_workers=2),    }    futures = []    for j in jobs:        p = pools[j["group"]]        futures.append(p.submit(slow_task, j["group"], j["name"], j["sec"]))    done = 0    for f in as_completed(futures):        if f.result():            done += 1    for p in pools.values():        p.shutdown()    return done  if __name__ == "__main__":    jobs = [        {"group": "examine", "name": "体检-1", "sec": 0.8},        {"group": "examine", "name": "体检-2", "sec": 0.8},        {"group": "clinic", "name": "门诊-1", "sec": 0.1},        {"group": "clinic", "name": "门诊-2", "sec": 0.1},    ]    t1 = time.time()    n1 = run_shared_pool(jobs)    cost1 = time.time() - t1     t2 = time.time()    n2 = run_isolated_pool(jobs)    cost2 = time.time() - t2     print("共享池完成 " + str(n1) + " 个任务,耗时 " + "{:.2f}".format(cost1) + "s")    print("隔离池完成 " + str(n2) + " 个任务,耗时 " + "{:.2f}".format(cost2) + "s")    if cost2 < cost1:        print("隔离池更快:慢科室没有拖垮快科室")
目的:用 Python 线程池模拟“共享池”与“隔离池”两种架构,直观对比慢任务阻塞对整体吞吐的影响。
  1. with ThreadPoolExecutor(max_workers=2) as pool:共享池只有 2 个线程,任何任务都占用同一批资源,好比所有病人在一个大厅排队。
  2. futures = [pool.submit(...) for j in jobs]所有任务提交到同一个线程池,没有科室之分,慢任务会抢占快任务的线程。
  3. pools = {"examine": ThreadPoolExecutor(max_workers=2), ...}为每个业务分组创建独立线程池,这是舱壁模式的核心:各科室独立挂号和候诊。
  4. pools[j["group"]]按任务的分组取出对应的线程池,体检科的任务永远进体检科的池,门诊科的任务进门诊科的池。
  5. as_completed(futures)等待任务完成并统计结果;在共享池中,门诊任务必须排队等体检任务跑完。

常见误区

误区把线程池调大一点,并发能力更强,就算有慢请求也不怕,故障抗性也会更强。

正解线程数超过 CPU 核心数后,上下文切换开销会急剧上升,吞吐量反而下降。更重要的是,隔离的本质不是“资源多”,而是“边界清晰”。一个巨型线程池被慢请求堵住时,依然会拖垮其他业务;而且池越大,慢请求消耗的资源就越多,爆炸半径反而更大。医院如果只顾着把大厅扩大,不设科室隔断,一个抢救手术照样堵死所有人。

为何常见:直觉上觉得“资源冗余”就等于“高可用”,忽略了调度成本和故障边界才是隔离的关键。

误区我们项目里任务都是走线程池的,这已经是隔离了。

正解如果所有业务共用一个全局线程池,那就只是把公共大厅换成了更大的公共大厅,根本谈不上隔离。真正的线程池隔离要求三个独立:独立的线程池、独立的阻塞队列、独立的信号量配额。缺了任何一项,不同业务之间依然在共享资源,慢任务照样能通过公共队列传染到其他业务。医院分科后,如果挂号窗口和候诊区还是共用的,分科就只是形式主义。

为何常见:“用线程模型处理任务”和“按业务隔离线程”是两个维度,初学者容易把“用了线程池”误当成“做了线程池隔离”。

误区我们把服务扩容到了 10 个副本,做了集群隔离,肯定不怕故障了。

正解10 个副本如果共享同一个数据库、同一套配置中心、同一个物理机架、同一路电源,那么任何一个共享依赖挂掉,10 个副本会同时阵亡——这不是多舱船,只是一艘更大的单舱船。集群隔离要求故障域完全隔离:机器、机架、机房、数据库、缓存都要独立。就像城市里建了 10 家医院,但共用同一个水库,停水时全城医院一起停诊。

为何常见:把“水平扩容”和“故障隔离”混为一谈。扩容解决的是性能瓶颈,隔离解决的是故障边界,两者是不同维度的问题。

面试题

Q1. “线程池隔离”的核心思想是什么?

单选题 · easy

  • A.所有业务共用一个超大线程池
  • B.各业务使用彼此独立的线程池← 正确答案
  • C.用并行算法提升单任务速度
  • D.线程池数量随负载无限增长

答案:B。线程池隔离的本质是为不同业务建立独立线程池,让慢任务只堵住自己的“科室”,不拖累其他业务。A 是典型的无隔离公共池,C 是并行计算的概念,D 会导致资源失控。

Q2. 在故障影响度公式 I=(Nf×B)/NtI = (N_f \times B) / N_t 中,BB 代表什么?

单选题 · easy

  • A.业务吞吐总量
  • B.故障扩散系数← 正确答案
  • C.线程池的最大容量
  • D.请求的失败重试次数

答案:B。扩散系数 BB 描述故障能否传染到邻居节点,介于 0 到 1 之间。B=1B=1 表示完全共享无隔离,B=0B=0 表示故障被完全囚禁——它是衡量隔离效果的核心指标。

Q3. 舱壁模式最重要的设计意图是什么?

单选题 · mid

  • A.提高单个服务的响应速度
  • B.将资源按依赖划分隔离故障← 正确答案
  • C.减少服务器硬件的采购成本
  • D.统一管理所有线程池存活

答案:B。舱壁模式从泰坦尼克号的水密隔舱得到启发,按依赖或服务将资源池切分成独立舱室,一个舱损坏不影响其他舱。它不直接加速请求,也不省钱,而是牺牲部分资源利用率换取故障隔离能力。

Q4. 集群隔离与单纯多副本部署的关键区别是什么?

单选题 · mid

  • A.集群数量部署得更多
  • B.故障域之间完全不重叠← 正确答案
  • C.统一使用容器编排工具
  • D.机房间网络带宽更高

答案:B。多副本如果共享数据库、机房和配置中心,故障照样全灭。集群隔离要求故障域不重叠——独立机器、独立机架、独立机房、独立依赖。关键不在于副本多,而在于“炸弹炸掉一个舱时,另一个舱毫发无损”。

Q5. 线程池隔离中,信号量隔离主要限制什么?

单选题 · mid

  • A.并发访问数量上限← 正确答案
  • B.任务队列的存储长度
  • C.线程存活的时长下限
  • D.CPU 使用率的峰值

答案:A。信号量隔离是在线程池之外再加一道“闸机”,限制同时进入某个舱的并发请求数。超过配额的请求直接快速失败或降级,防止洪峰打穿舱壁。它限制的是并发量,而非队列长度或线程寿命。

Q6. 以下哪个现象最能体现“故障扩散”?

单选题 · easy

  • A.内存不足触发频繁垃圾回收
  • B.慢接口占满公共线程池拖垮其他业务← 正确答案
  • C.日志磁盘写入速度缓慢
  • D.CPU 利用率长期超过百分之八十

答案:B。故障扩散是指故障从单一源头通过共享资源蔓延到整个系统。慢接口占满公共线程池,导致所有业务的请求全部排队超时,正是最典型的故障扩散现象。其余选项都只是单点性能问题。

Q7. 隔离粒度越细,带来的主要代价是?

单选题 · hard

  • A.故障时的恢复时间变长
  • B.资源利用率下降与运维变复杂← 正确答案
  • C.网络链路延迟显著增高
  • D.数据库写入性能必然下滑

答案:B。细粒度隔离意味着更多独立线程池、更多信号量配额、更多降级预案,资源无法跨舱借用,空闲舱的资源被浪费,运维配置复杂度也急剧上升。隔离不是免费的,粒度越细“租金”越贵,需要权衡收益与成本。

Q8. 实施线程池隔离时,正确的做法有哪些?

多选题 · mid

  • A.为高优业务与普通业务建立独立线程池← 正确答案
  • B.每个业务模块配置独立的阻塞队列← 正确答案
  • C.所有业务共享一个全局阻塞任务队列
  • D.为慢外部依赖设置独立信号量配额← 正确答案

答案:ABD。独立线程池、独立队列、独立信号量是线程池隔离的三要素。共享全局队列会让慢任务再次传染所有业务,是错误做法。A、B、D 分别保证了线程、队列、并发三个维度的隔离,缺一不可。

Q9. 判断集群隔离是否有效,应考察哪些维度?

多选题 · hard

  • A.物理机与机架是否相互独立部署← 正确答案
  • B.数据库与配置中心是否各自独立← 正确答案
  • C.故障是否可以在集群间继续传播← 正确答案
  • D.服务器是否来自同一批采购批次

答案:ABC。集群隔离有效的前提是故障域不重叠:机器、机架、机房、数据库、配置中心全部独立,且故障无法跨集群传播。采购批次不影响故障域,同批次的机器分布在两个独立机房里依然算有效隔离。

Q10. 关于舱壁模式治理与落地的实施要点,正确的是?

多选题 · extreme

  • A.对舱内流量实施实时监控告警← 正确答案
  • B.定期进行故障演练验证隔舱完成度← 正确答案
  • C.按容量预算为每个隔舱分配资源← 正确答案
  • D.舱满后无限排队来防止任务失败

答案:ABC。舱壁建好后需要持续治理:监控舱内水位与错误率、定期做混沌演练验证舱壁是否真实有效、按预算合理分配每个舱的容量。舱满后无限排队会让请求堆死,正确的做法是快速失败或降级兜底,因此 D 错误。