土法炼钢兴趣小组的算法知识备份

【系统架构设计百科】容灾架构:多活与灾备设计

文章导航

分类入口
architecture
标签入口
#disaster-recovery#active-active#RPO#RTO#multi-site#LDC

目录

2021 年 10 月 4 日,Facebook 全球宕机超过 6 小时。原因是一次 BGP 配置变更把所有数据中心的路由撤回了,DNS 服务器无法被访问,连内部员工的门禁系统都失效了——工程师甚至需要拿角磨机切开机房大门。这次事故造成的直接收入损失超过 1 亿美元,市值蒸发约 470 亿美元。

这不是一个遥远的故事。2023 年 11 月,阿里云香港 Region 因为机房冷却系统故障导致大面积服务中断,影响数千家企业客户。2024 年 7 月,CrowdStrike 的一次错误更新导致全球约 850 万台 Windows 设备蓝屏,航空公司停飞、银行停业、医院推迟手术。

这些事故有一个共同特征:单点故障(Single Point of Failure)被放大到了系统级甚至全球级。容灾架构(Disaster Recovery Architecture)的核心目标,就是在硬件故障、软件缺陷、网络中断、自然灾害甚至人为误操作发生时,把业务影响控制在可接受的范围内。

这篇文章要回答三个问题:

  1. 容灾等级怎么划分,不同等级的 RPO/RTO 和成本差异有多大?
  2. 数据同步有哪些拓扑,各自的一致性与延迟特征是什么?
  3. 真正的”多活”到底怎么做——以蚂蚁金服 LDC 架构为例?

上一篇中,我们讨论了优雅降级——当系统过载时如何有策略地丢弃非核心功能以保全核心链路。容灾是更上一层的命题:当整个数据中心甚至整个地域不可用时,系统如何继续运行。


一、容灾基础概念:RPO、RTO 与 RCO

在讨论任何容灾方案之前,必须先对齐三个核心指标。

RPO:恢复点目标

RPO(Recovery Point Objective,恢复点目标)回答的问题是:能容忍丢多少数据? 它是从故障发生时间点往回看,最多可以丢失多长时间窗口内的数据。

RTO:恢复时间目标

RTO(Recovery Time Objective,恢复时间目标)回答的问题是:能容忍停多久? 它是从故障发生到业务恢复正常所允许的最长时间。

RCO:恢复成本目标

RCO(Recovery Cost Objective,恢复成本目标)是一个经常被忽略但极其重要的维度:为了达到目标 RPO 和 RTO,愿意付出多少成本? 这里的成本包括硬件资源、网络带宽、运维人力和架构复杂度。

一个残酷的现实是:RPO 和 RTO 越低,成本呈指数增长。把 RTO 从 4 小时降到 30 分钟,成本可能翻 3 倍;从 30 分钟降到 0,成本可能翻 10 倍。

成本
 ↑
 |                           *
 |                       *
 |                  *
 |            *
 |       *
 |    *
 |  *
 | *
 |*
 +————————————————————→ RPO/RTO 降低

这意味着容灾方案的选择,本质上是一个业务价值与技术成本之间的权衡。一个日均交易额 10 万元的系统和一个日均交易额 10 亿元的系统,合理的容灾等级完全不同。


二、容灾等级:从冷备到多活

业界通常把容灾方案分为以下几个等级,每个等级对应不同的 RPO、RTO 和成本。

冷备份(Cold Standby)

最基本的容灾方式。定期把数据备份到异地存储(磁带、对象存储等),灾难发生时从备份恢复。

温备份(Warm Standby)

备用站点的硬件和软件已经部署就绪,数据通过异步复制保持近实时同步,但备用站点不承担业务流量。灾难发生时,需要启动应用服务并切换流量。

热备份(Hot Standby)

备用站点与主站点完全同步,应用服务已启动并随时可以接收流量。灾难发生时,只需切换流量入口。

同城双活(Same-City Active-Active)

两个数据中心位于同一城市(通常距离 30-80 公里),通过专线连接,延迟在 1-3 毫秒以内。两个中心同时承担业务流量,互为备份。

异地多活(Cross-Region Active-Active)

多个数据中心分布在不同城市甚至不同国家,每个中心独立承担一部分业务流量。这是容灾等级最高的方案,也是架构复杂度最高的方案。

下表汇总了各等级的关键指标:

容灾等级 RPO RTO 基础设施成本(相对值) 架构复杂度 适用场景
冷备份 4-24 小时 数小时-数天 1x 非核心系统、合规备份
温备份 秒-分钟级 分钟-小时级 2-3x 重要业务系统
热备份 接近 0 秒-分钟级 3-5x 中高 核心交易系统
同城双活 0 秒级 4-6x 金融、支付
异地多活 秒级 秒级 8-15x 极高 大型互联网核心业务

三、数据同步的五种拓扑

容灾架构的核心难点在数据。计算层是无状态的,可以随时在任意节点重启;但数据层是有状态的,必须保证在多个站点之间的一致性。数据同步拓扑的选择,直接决定了 RPO、延迟和系统复杂度。

拓扑一:同步复制(Synchronous Replication)

每一笔写操作必须等待远端副本确认后才返回成功。

客户端 → 主节点 → 写入本地 → 发送到从节点 → 从节点确认 → 返回客户端

拓扑二:异步复制(Asynchronous Replication)

写操作在主节点完成后立即返回成功,后台异步把变更发送到从节点。

客户端 → 主节点 → 写入本地 → 返回客户端
                              ↓(异步)
                         发送到从节点

拓扑三:半同步复制(Semi-Synchronous Replication)

写操作需要至少一个从节点确认接收到日志(但不需要写入完成)后才返回成功。这是同步和异步之间的折中。

MySQL 的半同步复制(Semi-Sync Replication)就是这种模式:主节点等待至少一个从节点的 ACK 后返回。如果超时未收到 ACK,会退化为异步复制。

拓扑四:多主复制(Multi-Master Replication)

多个节点同时接受写操作,节点之间互相同步变更。

主节点 A ←→ 主节点 B
   ↕              ↕
主节点 C ←→ 主节点 D

拓扑五:链式复制(Chain Replication)

变更按固定顺序在节点链上传播:主节点 → 节点 A → 节点 B → 节点 C。读请求从链尾节点响应,保证读到的数据一定是已经完全复制的。

写入 → 节点 A → 节点 B → 节点 C → 读取
 (head)                        (tail)

下面用一张对比表来总结五种拓扑:

拓扑 RPO 写入延迟 冲突处理 架构复杂度 典型应用
同步复制 0 高(受网络延迟影响) 同城双活数据库
异步复制 > 0 跨地域灾备
半同步复制 通常为 0 MySQL 同城 HA
多主复制 取决于同步方式 低(本地写入) 复杂 异地多活
链式复制 0 中(链长度决定) Azure Storage

四、同城双活架构

同城双活是国内金融行业最常见的容灾方案,也是很多企业从”单机房”走向”高可用”的第一步。

基本架构

两个数据中心位于同一城市,通过裸光纤或专线连接,网络延迟通常在 1-2 毫秒。

graph TB
    subgraph 用户层
        U[用户请求]
    end

    subgraph 流量调度层
        GLB[全局负载均衡 GSLB]
    end

    subgraph 数据中心 A
        LBA[负载均衡 A]
        APPA1[应用集群 A]
        CACHA[缓存集群 A]
        DBA[数据库主节点]
    end

    subgraph 数据中心 B
        LBB[负载均衡 B]
        APPB1[应用集群 B]
        CACHB[缓存集群 B]
        DBB[数据库从节点]
    end

    U --> GLB
    GLB --> LBA
    GLB --> LBB
    LBA --> APPA1
    LBB --> APPB1
    APPA1 --> CACHA
    APPB1 --> CACHB
    APPA1 --> DBA
    APPB1 --> DBA
    DBA -- 同步复制 --> DBB

关键设计点

数据层:谁是主? 同城双活的数据库通常只有一个写入主节点。两个中心的应用都可以处理请求,但写操作要么路由到主节点所在的中心,要么通过专线跨中心访问主节点。这意味着”双活”实际上是计算层双活、数据层主从。

缓存层:独立还是共享? 两种方案各有利弊。独立缓存意味着每个中心维护自己的缓存,切换时缓存需要预热;共享缓存意味着通过专线访问同一套缓存集群,延迟稍高但数据一致性好。大多数实践选择独立缓存 + 异步同步。

故障切换:自动还是手动? 自动切换速度快,但误判风险高——网络抖动可能导致脑裂。手动切换更安全,但 RTO 会增加到分钟级。金融系统通常选择半自动:系统自动检测故障并生成切换建议,人工确认后执行。

同城双活的局限

同城双活能应对单机房级别的故障(硬件损坏、机房断电、网络设备故障),但无法应对城市级灾难。2021 年郑州暴雨导致多个数据中心断电断网,如果两个机房都在郑州,同城双活就毫无意义。

因此,对于对可用性要求极高的系统,同城双活只是起点,还需要叠加异地灾备或异地多活。


五、两地三中心架构

“两地三中心”是国内金融行业监管推荐的容灾架构模式,在人民银行和银保监会的多个文件中都有明确要求。

架构模型

“两地”指同城和异地,“三中心”指同城两个数据中心(生产中心 + 同城灾备中心)和异地一个灾备中心。

┌─────────────────────────────────────┐   ┌────────────────────────┐
│          城市 A(同城两中心)           │   │      城市 B(异地)       │
│                                     │   │                        │
│  ┌──────────┐    ┌──────────┐      │   │  ┌──────────┐         │
│  │ 生产中心   │←──→│ 同城灾备  │      │   │  │ 异地灾备  │         │
│  │ (Active)  │同步 │ (Standby)│      │   │  │(Standby) │         │
│  └──────────┘    └──────────┘      │   │  └──────────┘         │
│                                     │   │                        │
└─────────────────────────────────────┘   └────────────────────────┘
            ←———— 异步复制 ————→

工作模式

挑战

  1. 异地灾备中心的资源浪费。异地中心在正常情况下不承担流量,但必须维持与生产中心相同配置的硬件。这是纯粹的成本支出。
  2. 异地切换的演练不足。很多企业的异地切换流程一年都演练不了一次。真正灾难发生时,切换脚本可能已经过时,切换过程中暴露出各种未预见的问题。
  3. 数据一致性的妥协。异步复制意味着异地切换时一定会丢数据。丢多少?取决于复制延迟。对于金融业务,每一笔交易数据的丢失都是不可接受的,这就形成了一个两难:同步复制到异地延迟太高影响用户体验,异步复制到异地有丢数据风险。

六、异地多活架构

异地多活是容灾的终极形态——不再区分”生产”和”灾备”,每个数据中心都是生产中心,都在同时处理真实业务流量。

核心挑战

异地多活要解决的核心问题只有一个:跨地域的数据一致性

假设用户 A 在北京下了一笔订单,这笔订单的数据写入了北京的数据库。此时如果用户 A 的请求被调度到了上海,上海的数据库里有没有这笔订单?如果没有,用户会看到自己的订单”消失”了。

这个问题有三种解决思路:

思路一:全局同步复制。 每一笔写操作同步到所有数据中心后才返回。数据强一致,但写入延迟 = 最慢的那个数据中心的网络往返时间。北京到上海的网络延迟约 30 毫秒,北京到广州约 50 毫秒——一次写操作要额外增加 50+ 毫秒的延迟,在高频交易场景下不可接受。

思路二:异步复制 + 用户维度路由。 把数据按用户维度分区,每个用户的所有请求固定路由到同一个数据中心。用户 A 的数据只在北京写入和读取,不需要实时同步到上海。只有当北京不可用时,才切换到上海,此时接受短暂的数据延迟。

思路三:单元化架构。 将整个业务逻辑和数据按用户维度封装到一个”单元”(Unit 或 Cell)中,每个单元可以部署在任意数据中心,单元内部的数据操作是自包含的。这是蚂蚁金服 LDC 架构的核心思想。

数据分区策略

异地多活的关键是确定”按什么维度分数据”。

最常见的分区维度是用户 ID。电商、社交、金融等 C 端业务,绝大多数操作都与单个用户强关联——“我的订单”、“我的余额”、“我的消息”。把同一个用户的所有数据放在同一个数据中心,可以避免绝大多数跨中心的数据依赖。

但总有一些操作是跨用户的——用户 A 转账给用户 B,两人的数据可能在不同的数据中心。这类跨单元操作需要分布式事务或异步补偿机制来保证一致性。

分区策略的选择直接决定了跨单元操作的比例。好的分区策略能把跨单元操作控制在 5% 以下。


七、蚂蚁金服 LDC 架构深度解析

蚂蚁金服(现蚂蚁集团)的 LDC(Logical Data Center,逻辑数据中心)架构是国内异地多活实践的标杆案例,支撑了每年双十一数十万笔/秒的支付峰值。

核心概念

LDC 的核心思想是把传统的”物理数据中心”抽象为”逻辑数据中心”。一个逻辑数据中心包含完整的应用层、缓存层和数据层,能够独立处理一组用户的所有请求。

graph TB
    subgraph 流量入口
        DNS[DNS / GSLB]
    end

    subgraph 城市 A
        subgraph Zone-A-1
            APP_A1[应用服务]
            DB_A1[数据分片 0-63]
        end
        subgraph Zone-A-2
            APP_A2[应用服务]
            DB_A2[数据分片 64-127]
        end
    end

    subgraph 城市 B
        subgraph Zone-B-1
            APP_B1[应用服务]
            DB_B1[数据分片 128-191]
        end
        subgraph Zone-B-2
            APP_B2[应用服务]
            DB_B2[数据分片 192-255]
        end
    end

    DNS --> Zone-A-1
    DNS --> Zone-A-2
    DNS --> Zone-B-1
    DNS --> Zone-B-2

    DB_A1 -. 异步复制 .-> DB_B1
    DB_A2 -. 异步复制 .-> DB_B2
    DB_B1 -. 异步复制 .-> DB_A1
    DB_B2 -. 异步复制 .-> DB_A2

Zone 与 RZone

LDC 把数据按用户 ID 哈希分成若干个分片(通常 256 个),这些分片被分配到不同的 Zone(可用区)。每个 Zone 是一个逻辑单元,包含处理该分片数据所需的全部服务。

Zone 分为两类:

流量路由

用户请求进入系统后,路由层根据用户 ID 计算出该用户所属的 Zone,然后将请求路由到该 Zone 所在的物理机房。

用户请求 → 接入层 → 用户 ID % 256 → 分片号 → 查路由表 → Zone 所在机房 → 处理

路由表是动态的。当需要把某些 Zone 从城市 A 迁移到城市 B 时,只需要:

  1. 停止该 Zone 的写入。
  2. 等待数据同步完成。
  3. 更新路由表,把流量切到城市 B。
  4. 开放写入。

整个过程可以做到分钟级切换,且只影响被迁移 Zone 的用户。

跨 Zone 事务

当一笔操作涉及两个不同 Zone 的数据时(例如用户 A 在 Zone-1 转账给用户 B 在 Zone-3),LDC 使用基于 TCC(Try-Confirm-Cancel)的分布式事务框架来保证一致性。

TCC 的三个阶段:

  1. Try:预留资源。扣减用户 A 的余额(冻结),增加用户 B 的余额(冻结)。
  2. Confirm:确认操作。把冻结的余额变为实际扣减/增加。
  3. Cancel:回滚操作。如果 Try 阶段有任何步骤失败,释放所有冻结的资源。

为了减少跨 Zone 事务的比例,蚂蚁在业务层做了大量优化:把高频互动的用户尽量分配到同一个 Zone,把跨 Zone 操作尽量改为异步消息驱动。

容灾切换

LDC 的容灾切换本质上是 Zone 的迁移。当城市 A 的某个机房故障时:

  1. 故障检测系统发现异常。
  2. 决策系统判断需要切换。
  3. 将受影响 Zone 的路由切换到城市 B 的备用节点。
  4. 备用节点接管流量。

由于每个 Zone 的数据都在异地有副本,切换过程只涉及路由表的更新和短暂的写入暂停(等待数据同步追平),可以做到分钟级 RTO。


八、流量调度与 DNS 切换

容灾切换的”最后一公里”是流量调度——如何把用户的请求从故障站点引导到健康站点。

DNS 级别切换

最传统的方式是修改 DNS 解析记录,把域名指向新的 IP 地址。

GSLB 级别切换

GSLB(Global Server Load Balancing,全局服务器负载均衡)在 DNS 之上增加了智能调度能力。它可以根据用户地理位置、各站点的健康状况和负载情况,动态返回最优的 IP 地址。

常见的 GSLB 产品:

GSLB 的健康检查机制是关键。检查频率太低,故障检测延迟高;检查频率太高,可能因为网络抖动产生误判。通常采用多点探测 + 多次确认的策略:从多个探测点同时检查目标站点,只有超过半数探测点都报告故障时,才触发切换。

应用层级别切换

在应用层实现流量调度,绕过 DNS 缓存的问题。客户端在启动时从配置中心获取所有可用站点的地址列表,每次请求时根据策略选择目标站点。如果当前站点不可用,自动切换到备用站点。

客户端 → 配置中心获取站点列表 → 选择站点 A → 请求失败 → 切换到站点 B → 请求成功

Anycast 路由

使用 BGP Anycast 技术,多个站点共享同一个 IP 地址,BGP 协议自动把流量路由到最近的站点。某个站点故障时,BGP 路由收敛后流量自动转移到其他站点。

混合策略

实际生产环境通常组合使用多种调度方式:

GSLB(全局调度)→ 同城双活 LB → 应用层路由
      ↓                              ↓
DNS TTL = 60s              配置中心实时更新
多点探测健康检查              客户端侧快速故障转移

九、工程案例:某支付平台的两地三中心实践

以下案例来自国内某头部支付平台的公开技术分享,展示了从单机房到两地三中心的演进过程。

背景

演进历程

第一阶段:单机房主从。 一个机房内部署 MySQL 主从,应用服务器多实例部署。问题:机房级故障导致全部业务中断,2019 年某次机房空调故障导致服务中断 4 小时。

第二阶段:同城双活。 在同城建设第二个机房,通过裸光纤连接(延迟 1.2 毫秒)。MySQL 使用半同步复制,应用层双活。问题:数据库仍然是单主写入,写流量全部走主机房,主机房故障时需要人工切换主从。

第三阶段:两地三中心。 在异地城市建设第三个机房。同城两中心使用同步复制(RPO = 0),异地中心使用异步复制(RPO < 15 秒)。引入 GSLB 做流量调度,同城切换自动化(RTO < 30 秒),异地切换半自动化(RTO < 20 分钟)。

关键技术决策

数据库选型:MySQL Group Replication vs. OceanBase。 最终选择了 OceanBase(蚂蚁集团的分布式数据库),原因是 OceanBase 原生支持多副本强一致和自动故障切换,减少了中间件层的复杂度。

消息队列的跨机房同步。 使用 Kafka 的 MirrorMaker 2 做跨机房消息同步。遇到的坑:MM2 在网络抖动时可能产生消息重复,消费端必须做幂等处理。

缓存预热。 同城切换时,目标机房的 Redis 缓存命中率会骤降,导致大量请求穿透到数据库。解决方案:维护一份”热 Key 列表”,切换前提前把热 Key 加载到目标机房的 Redis。

容灾演练

每季度执行一次同城切换演练,每半年执行一次异地切换演练。演练流程:

  1. 提前 72 小时通知所有团队。
  2. T-2 小时:确认所有前置检查通过(数据同步延迟、缓存预热完成、监控告警就位)。
  3. T-0:执行切换。
  4. T+30 分钟:验证所有业务指标正常。
  5. T+2 小时:回切到原机房。
  6. T+24 小时:复盘。

第一次异地演练发现了 27 个问题,其中 3 个是 P0 级别(会导致切换失败的阻塞性问题)。这充分说明了定期演练的价值——没有测试过的容灾方案就是没有容灾方案


十、容灾架构的权衡

容灾方案的选择不是技术问题,是业务决策。以下是各方案的综合权衡:

维度 冷备份 温备份 热备份 同城双活 两地三中心 异地多活
RPO 小时级 分钟级 秒级 0 同城 0 / 异地秒级 秒级
RTO 天级 小时级 分钟级 秒级 同城秒级 / 异地分钟级 秒级
硬件成本 1x 2x 3x 5x 6x 10x+
运维复杂度 极高
抗城市级灾难
资源利用率 高(只需存储) 低(备用空闲) 低(备用空闲) 中(双活分担) 高(多活分担)
切换风险 高(长期未验证)
数据一致性 同城强 / 异地弱 最终一致
适合的业务规模 小型 / 非核心 中型 中大型 大型 大型金融 超大型互联网

选择建议

  1. 小型企业 / 非核心系统:冷备份 + 定期演练。成本低,满足基本的数据保护需求。
  2. 中型企业 / 重要业务:温备份或热备份。根据 RTO 要求选择。如果 RTO 要求小于 1 小时,选热备份。
  3. 金融企业 / 支付系统:两地三中心。满足监管要求,同城双活保证日常高可用,异地灾备应对极端情况。
  4. 大型互联网企业 / 全球化业务:异地多活。成本高但资源利用率高(每个中心都在承担流量),且用户体验最好(就近访问)。

十一、容灾架构的常见陷阱

陷阱一:灾备中心从未被真正测试

很多企业花了大量成本建设灾备中心,但从未做过完整的切换演练。等到真的需要切换时,发现脚本已经过时、配置已经漂移、数据同步已经中断了几个月都没人发现。

对策:把容灾演练纳入日常运维流程,至少每季度一次。每次演练后输出详细的复盘报告,跟踪所有问题的修复。

陷阱二:只关注基础设施,忽略应用层

数据库可以自动切换,但应用层的连接字符串、配置文件、第三方服务的 IP 白名单、CDN 回源地址——这些都需要同步更新。一个被遗忘的硬编码 IP 就可能导致切换失败。

对策:维护一份完整的”切换检查清单”,覆盖从 DNS 到应用到第三方依赖的所有环节。

陷阱三:忽视脑裂风险

在自动切换场景下,如果故障检测机制误判(例如网络分区导致备用中心认为主中心已宕机),可能出现两个中心同时认为自己是主中心的情况。两个主中心同时接受写操作,数据就会产生不可调和的冲突。

对策:引入仲裁节点(Arbiter)或法定人数(Quorum)机制。只有获得多数节点同意的一方才能成为主中心。

陷阱四:低估异地延迟对业务的影响

跨地域网络延迟(30-100 毫秒)看起来不大,但在一个涉及多次数据库读写和服务调用的请求链路中,这些延迟会累加。一个在同城环境下 50 毫秒完成的请求,在跨地域环境下可能需要 300 毫秒。

对策:在设计异地多活时,把延迟预算纳入性能模型。确保关键链路的跨地域调用次数最小化。


十二、结论

容灾架构不是一个技术选型问题,是一个业务风险管理问题。核心的决策框架是:

  1. 量化业务损失。系统每停 1 小时损失多少钱?每丢 1 分钟数据的代价是什么?
  2. 确定 RPO 和 RTO。根据业务损失确定可接受的数据丢失量和停机时间。
  3. 选择容灾等级。根据 RPO/RTO 要求和预算约束,选择合适的容灾方案。
  4. 验证,验证,再验证。定期演练是容灾体系中最重要的环节——一个未经验证的容灾方案,其可靠性为零。

从同城双活到异地多活,技术复杂度和成本呈指数增长。但这不意味着每个系统都需要异地多活。大多数系统,冷备份 + 定期演练就够了。关键是让容灾等级与业务价值匹配,然后把选定的方案真正落实到位。


导航

上一篇:优雅降级:有损服务设计的艺术

下一篇:SLO 工程:可靠性的量化管理


参考资料

论文与书籍

-Erta Hoefler, et al., “Disaster Recovery Planning: A Strategy Guide”, Addison-Wesley, 2014. 容灾规划的系统性参考。 - Martin Kleppmann, “Designing Data-Intensive Applications”, O’Reilly, 2017. 第五章关于数据复制拓扑的经典论述。 - Pat Helland, “Life beyond Distributed Transactions: an Apostate’s Opinion”, CIDR, 2007. 单元化架构思想的理论基础。

工业实践

标准与规范

同主题继续阅读

把当前热点继续串成多页阅读,而不是停在单篇消费。

2026-04-13 · architecture

【系统架构设计百科】高可用设计模式:冗余、故障转移与仲裁

Active-Passive、Active-Active、N+1 冗余——不同模式的故障检测与切换机制有何差异?本文拆解高可用的度量体系、冗余模型、故障转移机制、脑裂问题与 Fencing 策略,结合 VIP 漂移与 DNS 切换的工程实现,讨论主备切换中的数据一致性,最后以某支付系统数据库高可用架构为例,给出模式选型的完整对比。

2026-04-13 · architecture

【系统架构设计百科】架构质量属性:不只是"高可用高性能"

需求评审时写下的'高可用、高性能、高并发',到了架构设计阶段几乎无法落地——因为它们不是可执行的需求。本文从 SEI/CMU 的质量属性理论出发,用 stimulus-response 场景模型把模糊需求变成可量化、可验证的架构约束,并拆解属性之间的冲突与联动关系。

2026-04-13 · architecture

【系统架构设计百科】告警策略:如何避免"狼来了"

大多数团队的告警系统都在制造噪声而不是传递信号。阈值告警看似直观,实则产生大量误报和漏报,值班工程师在凌晨三点被叫醒,却发现只是一次无害的毛刺。本文从告警疲劳的工业数据出发,拆解基于 SLO 的多窗口燃烧率告警算法,深入 Alertmanager 的路由、抑制与分组机制,结合 PagerDuty 的告警疲劳研究和真实工程案例,给出一套可落地的告警策略设计方法。

2026-04-13 · architecture

【系统架构设计百科】复杂性管理:架构的核心战场

系统复杂性是架构腐化的根源——本文从 Brooks 的本质复杂性与偶然复杂性划分出发,结合认知负荷理论与 Parnas 的信息隐藏原则,系统阐述复杂性的来源、度量与控制手段,并给出可操作的架构策略


By .