去年冬天在苏州产业园楼下的咖啡馆,碰到个做电商的技术负责人,坐我对面闷头喝了三杯美式,说前一天压测刚出的事。
本来他们团队为了备战年货节,花了小半年搭了三机房多活的架构,从测试报告看可用性能到99.99%,结果压测到第三轮,整个华东区的业务接口全超时。查了整整四个小时才找到原因——三个机房的出口光缆,全是从同一个地下管井穿出来的,施工队挖断了其中一段,等于三个机房全断网。那天他说这句话的时候,手里的美式杯壁上全是冷凝水,滴在笔记本上,晕开了半页压测报告。
你以为的隔离,其实根本没隔
很多团队做故障域设计的思路,从一开始就偏了。
上来就把服务拆成几个模块,每个模块在不同的云服务器上开两三个副本,就觉得自己做了隔离,高可用稳了。根本没人往下挖——这些服务器所在的机架,是不是连在同一个交换机上?这些交换机的供电,是不是同一路PDU?甚至这些服务器所在的机房,是不是共用同一个运营商的接入线路?
我见过太多团队的故障复盘报告,写的根因全是”服务副本不足””熔断配置不合理”,翻到最底层,全是最基础的物理层共享依赖没排查到。就像你家里的三个插座,看着是三个独立的面板,其实背后插在同一个插排上,只要插排的开关跳了,三个插座全没电。
说真的那天那个电商团队的运维负责人,跟我吐槽说当初架构评审的时候,网络组的同事提过一句光缆同路由的问题,被大家当成了”没必要抠的细节”,结果这一个细节,差点让他们整个大促的准备工作全打了水漂。

故障域不是人为划边界,是找所有共因
好多人对故障域的理解,就是按组织架构或者服务模块切蛋糕。
订单服务划一块,用户服务划一块,支付服务划一块,每个块单独做冗余,就算完事。
不对。
故障域的本质,是”一旦某个环节出问题,会被牵连到的最大业务范围”,不是你坐在会议室里画PPT能划出来的边界。
之前帮一个做在线直播的团队做架构评审,他们拍着胸脯说自己的直播链路接了四个不同的云厂商,就算其中一个云挂了,其他三个也能扛住全部流量。结果顺着链路往下查才发现,四个云厂商的CDN回源节点,用的全是同一家第三方BGP线路的同一个骨干网出口。只要这家线路的设备出问题,四个云的直播会同时卡成PPT。
离谱吧?
真正的故障域设计,从来不是只盯着自己可控的系统拆边界,而是要把所有藏在链路里的、你可能根本没直接付费对接的第三方依赖,全算进潜在的故障影响范围里。你以为你选了四个供应商做冗余,其实所有供应商在最底层的网络层,可能共用同一段基础设施。

别上来就砸钱搞顶配架构

一提到高可用的故障域设计,很多团队第一反应就是申请预算,搞跨城双活,搞多机房多活,算下来动辄几百万的投入。
其实真没必要。
去年在南京碰到个做城商行的技术团队,一开始报的双活方案预算是800万,要在隔壁城市租个独立机房,拉专属光缆,上全套的同步复制设备。结果拉着网络组、运维组、机房供应商的人,花了整整三天顺着链路盘了一遍,发现两个最离谱的共享点:第一个是他们现在用的两个同城机房,市电全来自同一个变电站的同一条出线,只要变电站跳闸,两个机房全黑;第二个是两个机房之间的互联光缆,走的是同一条地下管井的相邻管道,上次施工的时候挖断一次,两个机房的同步直接断了40分钟。
后来他们根本没租新机房。
先花了不到8万,把其中一个机房的供电切到了隔壁街道的变电站备用出线,又花了5万,把两个机房之间的互联光缆,绕了两个路口,换了不同的地下管井路由。前后加起来花了13万,整个核心链路的故障域隔离度,比之前花200万做的服务器多副本部署还高。当时他们算完账,整个项目组的人都笑了,之前为了写双活方案熬了三个大夜,结果核心风险根本不在机房和服务器上。
说实话,我见过太多团队把预算全砸在看得见的服务器扩容、软件授权上,对那些藏在物理层、第三方链路里的共享点视而不见。真出故障的时候,再好的软件架构,也扛不住一段被挖断的光缆,扛不住一次变电站的跳闸。
盘故障域的时候,别总想着一步到位搞顶配。先从最底层的链路开始查,从用户端的网络入口,到机房的供电、光缆、交换机,再到你对接的所有第三方服务,挨个问一句——这个点出问题,我哪些业务会受影响?
把这些最基础的共因风险兜住,比你在应用层写十套熔断降级脚本,管用多了。