有一天,公司决定重构十年前留下来的核心系统。
技术总监在会上只提了一个要求:「新架构一定不能有单点故障(Single Point of Failure,SPOF)。」资深工程师点点头。「明白。」
于是,原本只有一台服务器、一个数据库、一套程序的系统,正式开始现代化改造。第一个月,团队把单体架构(Monolithic Architecture)拆成了微服务架构(Microservices Architecture)。
原本一套程序,变成了四十七个服务。
用户登录有 Authentication Service,权限验证有 Authorization Service,用户资料有 User Service,订单有 Order Service,支付有 Payment Service,通知有 Notification Service。
甚至连「获取用户名」这样一件小事,也需要经过 API Gateway 调用 User Service。
领导看完架构图,非常满意。
「很好。这样任何一个服务挂了,都不会影响整个系统。」
工程师没有回答。
因为他正在思考:如果 Authentication Service 挂了,用户到底要怎么进去使用那些「没有受到影响」的服务。
第二个月,架构师认为服务之间直接相互调用,耦合度太高。
于是引入了 Kafka。
大家开始谈论事件驱动架构(Event-Driven Architecture)。
OrderCreated。
PaymentCompleted。
InventoryReserved。
ShipmentCreated。
每件事情都变成了一个 Event。
以前,工程师想知道「订单为什么没有发货」,查一下数据库就行。
现在要先问:
「你知道这笔订单的 Correlation ID 吗?」
不知道。
「那 Trace ID 呢?」
也不知道。
「Message Key 呢?」
没有。
「Partition 呢?」
不知道。
工程师沉默了三秒。
「那我们从 Kafka 第一个 Offset 开始找吧。」
第三个月,大家发现四十七个服务部署起来实在太麻烦。于是引入 Kubernetes,简称 K8s。
从此,公司的技术文档里开始出现许多以前没人用过的单词:
Pod。
Deployment。
ReplicaSet。
Service。
Ingress。
ConfigMap。
Secret。
Namespace。
StatefulSet。
DaemonSet。
领导看到 Replica 设置成 3,非常安心。
「很好,同一个服务有三份,就算挂一个也没问题。」
结果三个 Pod 全跑在同一台 Node 上。那台 Node 一挂,三个 Replica 一起消失。
架构师看了一眼 YAML。
「没关系,我们加 Pod Anti-Affinity。」
第二天,Kubernetes Scheduler 因为条件设得太严格,一个 Pod 都调度不上去。
领导问:「所以现在有几个 Replica?」
工程师回答:「理论上三个。」
「实际上呢?」
「零个。」
第四个月,系统开始变慢。
团队决定引入 Redis 做缓存(Cache)。
原本查一次数据库需要 200 ms。
加了 Redis 之后,只需要 5 ms。
所有人都非常高兴。
直到有一天,有人修改了用户资料。
数据库里是新的。
Redis 里是旧的。
另一个服务自己的 Local Cache 里又是更旧的。
领导问:
「到底哪份数据是真的?」
后端工程师回答:
「要看你问的是哪台。」
于是,团队开了三个小时的会,专门讨论 Cache Invalidation。
会议最后的结论是:
「先把 TTL 设成五分钟。」
第五个月,因为系统已经有四十七个服务,大家开始不知道错误究竟发生在哪里。于是引入了一整套可观测性(Observability)系统。
Prometheus 收 Metrics。
Grafana 画 Dashboard。
Loki 收 Logs。
Jaeger 做 Distributed Tracing。
Alertmanager 发告警。
现在,系统只要慢 100 ms,Grafana 上就有十五张图一起变色。
领导看着满墙的监控大屏,非常感动。「我们现在是不是什么问题都能看到了?」
SRE 回答:
「看得到。」
「那问题在哪?」
「不知道。」
「那这些图是干什么的?」
「证明真的有问题。」
第六个月,公司要求做到高可用(High Availability,HA)。
于是数据库做 Primary-Replica。
Redis 做 Cluster。
Kafka 做 Cluster。
Kubernetes 做 Multi-Node。
Ingress 做 Load Balancing。
机房做双线路。
服务跨 Availability Zone 部署。
技术总监再次强调:「我们绝对不能有任何单点故障。」
大家花了半年,把所有看得见的 Single Point of Failure 全部消灭。
最后,整个系统拥有:
47 个 Microservices。
186 个 Pods。
12 台 Kubernetes Nodes。
9 台 Kafka Brokers。
6 台 Redis Nodes。
4 台 Database Servers。
3 组 Load Balancers。
2 个 Availability Zones。
完整的 CI/CD Pipeline。
完整的 Monitoring。
完整的 Distributed Tracing。
完整的 Auto Scaling。
架构文档有两百多页。技术总监非常满意。
正式上线那天,他站在办公室里宣布:「各位,经过半年的努力,我们终于做出了一个没有单点故障的系统。」
全公司鼓掌。
五分钟后。
整个系统全挂了。
不是某一个服务。不是某一个机房。也不是某个 Database。而是所有服务同时失联。
技术总监冲进机房:「Kubernetes 挂了吗?」
「没有。」
「Kafka?」
「正常。」
「Database?」
「正常。」
「Redis?」
「正常。」
「Load Balancer?」
「正常。」
「网络呢?」
「也正常。」
技术总监更紧张了。「那到底哪里坏了?」
资深工程师看着屏幕,沉默了很久。
然后说:
「DNS。」
原来早上有人修改 DNS 配置时,多敲了一个字符。
所有服务其实都还在正常运行。
所有 Pod 都是 Healthy。
所有 Database 都是 Healthy。
Kafka 没有任何异常。
Redis Cluster 完全正常。
CPU 使用率正常。
Memory 正常。
Network 正常。
只有一个小问题:大家找不到彼此。
技术总监看着那份号称「完全没有 Single Point of Failure」的两百页架构文档,问了一句:
「我们不是已经把所有单点故障都消除了吗?」
资深工程师想了想。
「没有。」
「还有什么?」
工程师指了指 DNS。
「我们只是把单点故障藏得更深了。」
会议室安静了十秒。
技术总监又问:
「那 DNS 可以做高可用吗?」
工程师回答:
「可以。」
「那就做。」
一年后,公司拥有了两套 DNS、三层 Load Balancer、两个 Kubernetes Cluster、跨区 Kafka、跨区 Database Replication,以及一套连原作者自己都不敢改的 Terraform。
技术总监再次召开会议。
「现在总没有单点故障了吧?」
这一次,没有人回答。
因为上周,唯一知道整套架构究竟如何运作的那位资深工程师离职了。
技术总监环顾会议室。
「文档呢?」
有人回答:
「有。」
「在哪?」
「公司的 GitLab。」
「很好,那打开。」
工程师操作了一下。
「打不开。」
「为什么?」
「GitLab 的 SSO(Single Sign-On)依赖公司的 Authentication Service。」
技术总监停顿了一下。
「那 Authentication Service 怎么修?」
「部署方法写在 GitLab 里。」
「那 GitLab 怎么修?」
「Kubernetes 的配置也在 GitLab 里。」
「那 Kubernetes 呢?」
「Terraform。」
「Terraform 在哪?」
「GitLab。」
整个会议室再次安静下来。
最后,新来的工程师小心翼翼地问:「所以现在真正的 Single Point of Failure 是什么?」
所有人不约而同地看向资深工程师原来的位置。
桌子已经空了。
旁边只剩下一张便利贴。
上面写着:
「如果你需要看这张纸,说明 Disaster Recovery Plan 已经失败了。」
技术总监看完之后,沉默了很久。
最后,在下一季度的技术战略汇报中,新增了一页:
「2027 年核心架构改进计划」
第一项:「降低 Bus Factor。」
第二项:「建立完整的 Knowledge Transfer 机制。」
第三项:「不要再让所有文档的登录方式,依赖一个只有登录文档之后才能知道怎么修的登录系统。」
「在分布式系统里,真正困难的不是让每一台机器都不会坏,而是当每一台机器都正常的时候,找出为什么整个系统还是不能用。」
投稿日期:2026 年 10 月 4 日 17:30(CST)
技术总监在会上只提了一个要求:「新架构一定不能有单点故障(Single Point of Failure,SPOF)。」资深工程师点点头。「明白。」
于是,原本只有一台服务器、一个数据库、一套程序的系统,正式开始现代化改造。第一个月,团队把单体架构(Monolithic Architecture)拆成了微服务架构(Microservices Architecture)。
原本一套程序,变成了四十七个服务。
用户登录有 Authentication Service,权限验证有 Authorization Service,用户资料有 User Service,订单有 Order Service,支付有 Payment Service,通知有 Notification Service。
甚至连「获取用户名」这样一件小事,也需要经过 API Gateway 调用 User Service。
领导看完架构图,非常满意。
「很好。这样任何一个服务挂了,都不会影响整个系统。」
工程师没有回答。
因为他正在思考:如果 Authentication Service 挂了,用户到底要怎么进去使用那些「没有受到影响」的服务。
第二个月,架构师认为服务之间直接相互调用,耦合度太高。
于是引入了 Kafka。
大家开始谈论事件驱动架构(Event-Driven Architecture)。
OrderCreated。
PaymentCompleted。
InventoryReserved。
ShipmentCreated。
每件事情都变成了一个 Event。
以前,工程师想知道「订单为什么没有发货」,查一下数据库就行。
现在要先问:
「你知道这笔订单的 Correlation ID 吗?」
不知道。
「那 Trace ID 呢?」
也不知道。
「Message Key 呢?」
没有。
「Partition 呢?」
不知道。
工程师沉默了三秒。
「那我们从 Kafka 第一个 Offset 开始找吧。」
第三个月,大家发现四十七个服务部署起来实在太麻烦。于是引入 Kubernetes,简称 K8s。
从此,公司的技术文档里开始出现许多以前没人用过的单词:
Pod。
Deployment。
ReplicaSet。
Service。
Ingress。
ConfigMap。
Secret。
Namespace。
StatefulSet。
DaemonSet。
领导看到 Replica 设置成 3,非常安心。
「很好,同一个服务有三份,就算挂一个也没问题。」
结果三个 Pod 全跑在同一台 Node 上。那台 Node 一挂,三个 Replica 一起消失。
架构师看了一眼 YAML。
「没关系,我们加 Pod Anti-Affinity。」
第二天,Kubernetes Scheduler 因为条件设得太严格,一个 Pod 都调度不上去。
领导问:「所以现在有几个 Replica?」
工程师回答:「理论上三个。」
「实际上呢?」
「零个。」
第四个月,系统开始变慢。
团队决定引入 Redis 做缓存(Cache)。
原本查一次数据库需要 200 ms。
加了 Redis 之后,只需要 5 ms。
所有人都非常高兴。
直到有一天,有人修改了用户资料。
数据库里是新的。
Redis 里是旧的。
另一个服务自己的 Local Cache 里又是更旧的。
领导问:
「到底哪份数据是真的?」
后端工程师回答:
「要看你问的是哪台。」
于是,团队开了三个小时的会,专门讨论 Cache Invalidation。
会议最后的结论是:
「先把 TTL 设成五分钟。」
第五个月,因为系统已经有四十七个服务,大家开始不知道错误究竟发生在哪里。于是引入了一整套可观测性(Observability)系统。
Prometheus 收 Metrics。
Grafana 画 Dashboard。
Loki 收 Logs。
Jaeger 做 Distributed Tracing。
Alertmanager 发告警。
现在,系统只要慢 100 ms,Grafana 上就有十五张图一起变色。
领导看着满墙的监控大屏,非常感动。「我们现在是不是什么问题都能看到了?」
SRE 回答:
「看得到。」
「那问题在哪?」
「不知道。」
「那这些图是干什么的?」
「证明真的有问题。」
第六个月,公司要求做到高可用(High Availability,HA)。
于是数据库做 Primary-Replica。
Redis 做 Cluster。
Kafka 做 Cluster。
Kubernetes 做 Multi-Node。
Ingress 做 Load Balancing。
机房做双线路。
服务跨 Availability Zone 部署。
技术总监再次强调:「我们绝对不能有任何单点故障。」
大家花了半年,把所有看得见的 Single Point of Failure 全部消灭。
最后,整个系统拥有:
47 个 Microservices。
186 个 Pods。
12 台 Kubernetes Nodes。
9 台 Kafka Brokers。
6 台 Redis Nodes。
4 台 Database Servers。
3 组 Load Balancers。
2 个 Availability Zones。
完整的 CI/CD Pipeline。
完整的 Monitoring。
完整的 Distributed Tracing。
完整的 Auto Scaling。
架构文档有两百多页。技术总监非常满意。
正式上线那天,他站在办公室里宣布:「各位,经过半年的努力,我们终于做出了一个没有单点故障的系统。」
全公司鼓掌。
五分钟后。
整个系统全挂了。
不是某一个服务。不是某一个机房。也不是某个 Database。而是所有服务同时失联。
技术总监冲进机房:「Kubernetes 挂了吗?」
「没有。」
「Kafka?」
「正常。」
「Database?」
「正常。」
「Redis?」
「正常。」
「Load Balancer?」
「正常。」
「网络呢?」
「也正常。」
技术总监更紧张了。「那到底哪里坏了?」
资深工程师看着屏幕,沉默了很久。
然后说:
「DNS。」
原来早上有人修改 DNS 配置时,多敲了一个字符。
所有服务其实都还在正常运行。
所有 Pod 都是 Healthy。
所有 Database 都是 Healthy。
Kafka 没有任何异常。
Redis Cluster 完全正常。
CPU 使用率正常。
Memory 正常。
Network 正常。
只有一个小问题:大家找不到彼此。
技术总监看着那份号称「完全没有 Single Point of Failure」的两百页架构文档,问了一句:
「我们不是已经把所有单点故障都消除了吗?」
资深工程师想了想。
「没有。」
「还有什么?」
工程师指了指 DNS。
「我们只是把单点故障藏得更深了。」
会议室安静了十秒。
技术总监又问:
「那 DNS 可以做高可用吗?」
工程师回答:
「可以。」
「那就做。」
一年后,公司拥有了两套 DNS、三层 Load Balancer、两个 Kubernetes Cluster、跨区 Kafka、跨区 Database Replication,以及一套连原作者自己都不敢改的 Terraform。
技术总监再次召开会议。
「现在总没有单点故障了吧?」
这一次,没有人回答。
因为上周,唯一知道整套架构究竟如何运作的那位资深工程师离职了。
技术总监环顾会议室。
「文档呢?」
有人回答:
「有。」
「在哪?」
「公司的 GitLab。」
「很好,那打开。」
工程师操作了一下。
「打不开。」
「为什么?」
「GitLab 的 SSO(Single Sign-On)依赖公司的 Authentication Service。」
技术总监停顿了一下。
「那 Authentication Service 怎么修?」
「部署方法写在 GitLab 里。」
「那 GitLab 怎么修?」
「Kubernetes 的配置也在 GitLab 里。」
「那 Kubernetes 呢?」
「Terraform。」
「Terraform 在哪?」
「GitLab。」
整个会议室再次安静下来。
最后,新来的工程师小心翼翼地问:「所以现在真正的 Single Point of Failure 是什么?」
所有人不约而同地看向资深工程师原来的位置。
桌子已经空了。
旁边只剩下一张便利贴。
上面写着:
「如果你需要看这张纸,说明 Disaster Recovery Plan 已经失败了。」
技术总监看完之后,沉默了很久。
最后,在下一季度的技术战略汇报中,新增了一页:
「2027 年核心架构改进计划」
第一项:「降低 Bus Factor。」
第二项:「建立完整的 Knowledge Transfer 机制。」
第三项:「不要再让所有文档的登录方式,依赖一个只有登录文档之后才能知道怎么修的登录系统。」
「在分布式系统里,真正困难的不是让每一台机器都不会坏,而是当每一台机器都正常的时候,找出为什么整个系统还是不能用。」
投稿日期:2026 年 10 月 4 日 17:30(CST)