盖一座智能餐厅,你要先决定厨房怎么布。屋里的管线、灶台、传菜铃、中央厨房、外卖调度——每一种布置方式,都对应一种AI系统设计模式。选对了,订单再多也井井有条;选错了,热闹的生意也会卡在厨房里出不来。架构没有绝对好坏,只有合不合你的菜。本文会带你认识AI系统里最常见的八种设计模式,看懂它们的适用场景、优缺点、怎么组合,以及面对真实业务时如何做权衡取舍。

岗位关联

对AI从业者而言,架构选型能力是系统设计面试与技术决策的核心分水岭。掌握这些模式,你就能从“会写模型”进阶到“会搭系统”,真正扛起技术负责人的责任。

目录
  1. 可视化演示
  2. 单体架构:小厨房一灶到底
  3. 微服务分解:多灶分工协作
  4. 事件驱动:传菜铃解耦异步
  5. 管道流水线:标准工序链
  6. 批流一体化:批量与实时共舞
  7. 智能编排:总厨指挥协同
  8. 架构选型决策:称一称再下锅
  9. 组合与反模式:小心四不像
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

展示系统处理流水线、实时性能指标曲线及多方案对比分析,包含数据流转、吞吐延迟监控与方案评估。

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

系统可视化 处理流程:输入→处理→模型→输出 性能监控:实时指标 P=L×T

单体架构:小厨房一灶到底

想象你开一家街角小面馆。一个人、一口锅、一张菜单。客人点单,你煮面、浇头、端上桌,全部在一双手之间流转。这就是单体架构——把AI模型、数据处理、业务逻辑全部写在一个进程里,像一个全能的老师傅。启动方便,调试直接,前期开发速度飞快。对于刚起步的原型验证、内部工具或团队小于五人的场景,单体是性价比之王。

但生意变好后,问题来了。同一口锅,既要煮汤又要炒浇头,排队越来越长。单体架构里,一个函数占用大量CPU就会拖慢整个服务;模型推理的显存需求和业务接口的并发需求互相争夺资源。你没法只扩容“模型部分”,只能整锅重开,性能瓶颈和扩展受限成为最头疼的墙。

单体系统的吞吐量往往受最慢环节制约。当所有请求都经过同一个进程时,整体吞吐上限约等于单实例处理能力的倒数:

回到面馆比喻,单体适合“只服务一条街”的小生意。你的AI系统如果只需服务固定人群、场景单一,先别急着上微服务。把模型和代码装进一个干净利落的背包,快速跑通业务闭环,这才是架构演进的起点。

Qtotal=1tsingle\displaystyle Q_{total} = \frac{1}{t_{single}}
这个公式说明:单体的总吞吐量由每个请求的平均处理时间决定。想提升只能换更大的锅(垂直扩展),而垂直扩展终有天花板。
  1. 总吞吐量 \(Q_{total}\)系统每秒能完成的请求数量,好比面馆每分钟能出几碗面。
    QtotalQ_{total}
  2. 单请求耗时 \(t_{single}\)一个请求从进到出花的总时间,包括排队、计算、返回,好比煮一碗面所需的全部工序时长。
    tsinglet_{single}
  3. 倒数的意义吞吐量是耗时的倒数,因为完成一个请求后才能接下一个,串行关系让耗时越短,吞吐越高。
    1tsingle\frac{1}{t_{single}}

微服务分解:多灶分工协作

当小面馆变成连锁餐厅,你不再让一个厨子包办一切。有人负责炖肉,有人负责炒菜,有人负责摆盘,每个岗位独立成间。微服务架构就是这种“多灶分工”:把AI系统拆成数据服务、模型服务、业务服务等多个独立进程,各自部署、各自扩容。模型服务扛不住了,单独加几个副本即可;业务服务要改逻辑,也不用重新发布整个系统。

但分工带来协作的成本。炖肉和炒菜之间需要传菜员,服务之间则需要网络通信。服务数量一旦失控,通信开销会呈爆炸式增长。假设有 \(N\) 个服务,每两个都可能需要交互,那么潜在连接数量是:

微服务不是银弹。只有当团队规模、业务复杂度都配得上这套“多灶体系”时,独立部署的灵活性才能盖过网络开销的繁琐。就像连锁餐厅需要专业店长和稳定供应链,微服务也需要成熟的DevOps平台和监控体系。否则,你只是把单体的砍柴烧火,换成了满地管道跑气冒烟。

C=N×(N−1)2\displaystyle C = \frac{N \times (N-1)}{2}
这是N个节点两两握手的组合数公式。它提醒你:微服务不是越多越好,连接成本随服务数量平方级上升。
  1. 服务数量 \(N\)系统中独立部署的服务个数,好比连锁餐厅的岗位数。
    NN
  2. 两两组合数从N个服务中任选两个建立连接的方式数,用组合数表示。
    (N2)=N×(N−1)2\binom{N}{2} = \frac{N \times (N-1)}{2}
  3. 开销增长N从4变成8,连接数从6变成28,增长了近5倍,通信维护成本远超想象。
    N×(N−1)2\frac{N \times (N-1)}{2}

事件驱动:传菜铃解耦异步

在热闹的餐厅里,你不会让每道菜都追着顾客问“你要不要了”。顾客按铃下单,后厨听到铃声后按顺序做菜,做完再按铃通知传菜员。事件驱动架构就是这套“传菜铃”:系统各部分不直接调用对方,而是通过事件总线发布“订单已创建”“建模已完成”等消息,订阅者各取所需。这样下单服务和预测服务彻底解耦,高峰期的请求可以先落在队列里,后厨慢慢消化。

解耦带来了极高的弹性,但也换来一个代价:你不再能实时确认“这单到底做没做完”。系统只能达到最终一致,而不是强一致。队列中积压的消息数量有个经典规律——利特尔法则:

事件驱动非常适合流量忽高忽低的场景,比如电商大促时的推荐请求。传菜铃把“端菜”和“做菜”解耦后,即使顾客瞬间涌来,后厨也能按自己的节奏出餐。但同时要准备事件回溯工具,否则订单丢了,你都不知道是哪只铃没响。

L=λ×W\displaystyle L = \lambda \times W
利特尔法则说明:队列中的平均消息数 \(L\),等于平均到达速率 \(\lambda\) 乘以平均等待时间 \(W\)。它帮你在事件驱动系统里估算延迟与积压。
  1. 队列长度 \(L\)事件总线上已发布但还没被消费完的消息数量,好比传菜铃下积压的订单纸。
    LL
  2. 到达速率 \(\lambda\)每秒新产生的事件数量,好比顾客每秒按铃的次数。
    λ\lambda
  3. 等待时间 \(W\)一个事件从进入总线到被消费完的平均耗时,好比一张菜单从下单到端上桌的时间。
    WW
  4. 乘法关系三个量相互制约,知道任意两个就能算第三个。若到达速率过高而消费能力不变,队列会越来越长。
    L=λ×WL = \lambda \times W

管道流水线:标准工序链

走进一家日料店的开放式厨房,你会看到清晰的工序:洗米、切鱼、捏寿司、摆盘。每一道工序都有专人负责,前一环节做完就传给下一环节。管道模式正是这种“标准工序链”——AI系统被划分成数据清洗、特征提取、模型推理、结果后处理等阶段,像流水线一样依次执行。每个阶段都可以独立去耦合、单独优化,也可以随时插拔替换(比如换一个更好的模型服务)。

流水线最大的好处是并行加速。当多个请求同时流过时,不同请求可以重叠在不同阶段处理:第一条鱼还在切,第二条鱼已经开始洗。理想情况下,流水线的吞吐量取决于最慢的那个工序,也就是瓶颈。如果最慢工序耗时是 \(t_{max}\),则整个流水线的最大吞吐约为:

管道模式让AI系统变得像乐高积木一样可拼装。但注意,数据在工序间流动时会发生“变形”——清洗阶段的标准可能和推理阶段期待的不一样,这种数据漂移需要专门监控。好比捏寿司的师傅发现鱼片切得太厚,得立刻回头和后厨沟通,否则整条流水线都会出来“四不像”。

Qpipe=1tmax\displaystyle Q_{pipe} = \frac{1}{t_{max}}
这就是“瓶颈决定论”:流水线的总吞吐量不是所有工序速度的平均,而是被最慢的一道工序锁死。要想提速,优先优化最长耗时的那一环。
  1. 瓶颈耗时 \(t_{max}\)所有工序中耗时最长的那一道,比如“切鱼”需要40秒,其他只需10秒。
    tmaxt_{max}
  2. 流水线吞吐 \(Q_{pipe}\)单位时间内能完成处理并输出的请求总数。
    QpipeQ_{pipe}
  3. 倒数关系瓶颈工序每秒能过几个,整条流水线每秒就能出几个。你无法让整条线比最慢的还快。
    1tmax\frac{1}{t_{max}}

批流一体化:批量与实时共舞

餐厅有两种备菜方式:一种是每天早上按订单量大批量采购、集中炖煮;另一种是开饭高峰时边接单边现炒。聪明的中央厨房会两者结合——基础食材批量准备,风味浇头实时现做。AI系统同样分两派:离线批处理擅长处理海量历史数据,精确计算用户画像;实时流处理紧盯当前事件流,秒级响应异常行为。

Lambda架构是经典的“双轨制”:批处理层提供准确的全量视图,流处理层提供低延迟的近似视图,最后通过服务层合并结果。但维护两套代码成本太高,于是Kappa架构出现:只用流处理,把所有数据都当作流,需要批量计算时把流回放一遍。两者本质都是在权衡准确性与延迟。批量大小 \(B\) 与总延迟 \(D\) 的关系大致是:

批流一体化不是“二选一”,而是按菜下料。金融风控需要实时流来挡欺诈,对账报表需要批处理来保证准确。你的架构可以两条腿走路,但千万别让两条腿互相绊倒——明确哪些环节要准,哪些要快,才能让中央厨房和现炒灶台各司其职。

D=BR+P\displaystyle D = \frac{B}{R} + P
这个公式表示:一次批处理任务的延迟,等于批量数据量除以吞吐率(即排队时间),再加上固定处理时间。批量越大,等待越久;吞吐越高,等待越短。
  1. 批量大小 \(B\)一批次处理的数据量,好比一次采购的食材重量。
    BB
  2. 吞吐率 \(R\)系统每秒能处理的数据量,好比厨房每小时能洗的食材斤数。
    RR
  3. 排队时间 \(B/R\)把 \(B\) 份数据全部送入处理器所需的时间。
    BR\frac{B}{R}
  4. 固定处理时间 \(P\)处理第一份数据后,每份数据固有的计算耗时,好比起码要等锅热起来。
    PP
  5. 总延迟 \(D\)从数据到达最终可用,用户等待的总时长。
    D=BR+PD = \frac{B}{R} + P

智能编排:总厨指挥协同

一道佛跳墙要经过泡发、炖煮、收汁,每一步都要在合适的时机衔接。AI系统里,多个模型协同工作也像这道菜:先做意图识别,再调用知识检索,最后生成答案。智能编排就是那位“总厨”——负责定义工作流、调度任务、管理中间状态、处理失败重试。它把一个复杂AI请求拆成一棵任务树,并行分支可以同时跑,汇合点必须等所有前置任务完成。

编排器最核心的职责是状态管理。谁完成了、谁失败了、下一步该触发谁,这些信息必须时刻准确。一个可并行执行多个子任务的编排流程,其总耗时不是各任务耗时之和,而是取决于最长链路加上等待时间:

智能编排让AI系统从“一个模型单打独斗”升级为“多模型军团作战”。但总厨也要谨防事必躬亲——如果每个简单请求都要编排器协调一大堆子任务,反而会引入巨大延迟。好的编排是:能并行则并行,该串行就串行,关键时刻有超时和重试兜底。

Ttotal=max⁡(T1,T2,…,Tn)+Tsync\displaystyle T_{total} = \max(T_1, T_2, \dots, T_n) + T_{sync}
这个公式描述的是DAG调度中的关键路径:总耗时等于并行任务中耗时最长的那条链路,再加上任务之间的同步开销。编排的精髓就是让长任务和短任务合理重叠。
  1. 任务耗时 \(T_i\)第 \(i\) 个子任务从开始到结束的时间,好比炖牛肉要2小时,焯水只要5分钟。
    TiT_i
  2. 关键路径 \(\max(T_1, T_2, \dots, T_n)\)所有并行分支中最长的那条耗时,这是总耗时的下限。
    max⁡(T1,T2,…,Tn)\max(T_1, T_2, \dots, T_n)
  3. 同步开销 \(T_{sync}\)任务汇合时等待、数据聚合、状态持久化带来的额外时间,好比总厨把各灶台的菜收齐拼盘。
    TsyncT_{sync}

架构选型决策:称一称再下锅

面对那么多架构模式,到底选哪个?这就像开一家新餐厅,先要看自己的定位:是做街坊生意(小单体),还是做宴席连锁(微服务),还是做外卖平台(事件驱动)?架构选型不是一场“比谁更时髦”的竞赛,而是一场“称重”:拿出业务需求、团队能力、成本预算、演进空间四个砝码,在同一个天平上称。常用的做法是给每种候选架构评分,把多个维度加权求和:

决策框架中最关键的不是算分,而是选对维度。如果你的业务是给几万人用的内部工具,团队只有三人,那么“运维复杂度”的权重应该非常高,微服务得分自然被压下去。反之,当一个产品要服务千万级用户且需要持续迭代,单体的得分就不够看了。记住,架构选型是投资决策,不是技术信仰。

S=∑j=1mwj×sj\displaystyle S = \sum_{j=1}^{m} w_j \times s_j
这是一个多因子加权评分公式。\(s_j\) 是第 \(j\) 个维度上的得分,\(w_j\) 是它对应的权重。计算出的总分 \(S\) 决定架构候选的优先级。选架构不是直觉拍脑袋,而是可量化的决策。
  1. 维度得分 \(s_j\)某一维度上,该架构的符合程度(比如满分10分),好比“这道菜辣度给几分”。
    sjs_j
  2. 权重 \(w_j\)不同维度的重要程度,所有权重之和通常为1。业务匹配度可能占比30%,团队熟悉度可能占20%。
    wjw_j
  3. 求和 \(\sum\)把所有维度的加权分数累加,得到一个综合分。
    ∑j=1mwj×sj\sum_{j=1}^{m} w_j \times s_j

组合与反模式:小心四不像

现实中的AI系统往往不是单一模式,而是混合体:前面用管道做数据预处理,中间用事件驱动做消息缓冲,后端用微服务部署模型推理,还要编排器把几个模型串成工作流。模式混用本身没有错,错的是没有边界的混用。就像一家餐厅既想做大排档的烟火气,又想搞米其林的分餐制,结果厨师累死、顾客懵掉。

反模式通常有几张脸:服务拆得太碎导致“分布式怪物”,一个请求要跨十几台机器才能完成;中间件满天飞形成“依赖地狱”,升级一个组件引爆连锁故障;还有为了显示技术实力而强行引入Kafka、Kubernetes的“过度设计”。这些问题背后都有一个共同点:系统复杂度的增长速度超过了团队驾驭能力。我们可以用技术债来量化这种失控:

真正的架构高手会在每个十字路口问一句:“这层复杂度是订单量需要的,还是我的自嗨?”组合模式时,像配菜一样讲究主次分明:一个系统只能有一个核心骨架(比如微服务),其他模式作为局部增强(比如某些环节用事件驱动削峰)。守住边界,才能让多种模式和谐共处。

Ddebt=∑i=1kdi×ti\displaystyle D_{debt} = \sum_{i=1}^{k} d_i \times t_i
这里 \(d_i\) 是第 \(i\) 处不合理设计的复杂规模,\(t_i\) 是它拖累后续开发的时间。技术债的可怕之处在于,它的利息会不断滚雪球。
  1. 复杂度 \(d_i\)每处反模式涉及的模块数量和耦合程度,比如一个“上帝服务”依赖了50个其他服务。
    did_i
  2. 拖累时间 \(t_i\)因为这段坏味道,每次改动都要额外付出的沟通和返工时间。
    tit_i
  3. 求和 \(\sum\)把所有坏味道造成的损失累计起来,就是系统当前背负的技术债总额。
    ∑i=1kdi×ti\sum_{i=1}^{k} d_i \times t_i

AI 应用场景

场景一:智能客服系统的架构选型

阶段:系统架构设计

解决的问题:传统客服系统把所有功能写在一个单体进程里,遇到大促流量高峰期,会话服务和意图识别模型互相争抢CPU,延迟暴涨。通过对比微服务与事件驱动架构,把会话接入做成独立服务,将“用户提问”作为事件发布到消息队列,再由模型服务异步消费,实现了削峰填谷。

具体案例:某电商平台客服机器人每天处理200万次对话,高峰期流量是平日的10倍。采用事件驱动架构后,请求先进入Kafka队列,模型服务按最大吞吐匀速处理,高峰期用户排队等待平均3秒,但不会出现服务崩溃。系统整体可用性从99%提升到99.99%。

场景二:多模型协同的AIGC内容生产

阶段:工作流编排

解决的问题:一篇营销文案需要多个模型协作——先用审核模型判断主题合规,再用大模型生成初稿,最后用风格模型润色。传统硬编码调用流程难以维护,失败后无法恢复。使用智能编排器将三个模型定义为DAG工作流,每个步骤有独立状态和重试机制。

具体案例:某广告公司用编排器搭建文案流水线,生成一篇文案从原来串行调用耗时90秒降到并行编排后的35秒。某次大模型API超时,编排器自动重试并切换到备用模型,生成成功率从80%升到99.5%。

场景三:金融风控的批流双轨计算

阶段:数据处理与推理

解决的问题:风控系统既需要实时拦截可疑交易,又需要每天基于全量交易数据重新训练欺诈模型。单一架构难以同时满足低延迟与高准确。采用批流一体化架构,Kappa模式用实时流处理完成在线拦截,同时定期回放数据流生成全量训练集。

具体案例:某支付平台每天处理1亿笔交易,实时风控阈值在50毫秒内完成,每天凌晨用流回放方式离线更新模型参数。整套系统只维护一套流处理代码,避免了Lambda架构双写不一致的问题。

Python 演示

python42 行
# 架构选型决策助手class Architecture:    def __init__(self, name, scores):        self.name = name        self.scores = scores     def weighted_score(self, weights):        # scores 与 weights 是一一对应的列表        return sum(w * s for w, s in zip(weights, self.scores)) def main():    # 维度顺序: 业务匹配度, 团队熟悉度, 成本控制, 可扩展性, 运维复杂度(低为好)    candidates = [        Architecture("单体架构", [7, 9, 9, 3, 2]),       # 运维复杂度得分2表示很低        Architecture("微服务架构", [6, 4, 4, 9, 8]),     # 运维复杂度得分8表示很高        Architecture("事件驱动架构", [8, 5, 5, 8, 6]),        Architecture("管道流水线", [6, 7, 6, 5, 3]),        Architecture("批流一体化", [7, 5, 5, 7, 5]),    ]     # 输入你的场景权重,例如创业公司早期    print("请输入五个维度权重(和为1):")    weights = []    dims = ["业务匹配度", "团队熟悉度", "成本控制", "可扩展性", "运维复杂度"]    for i, dim in enumerate(dims):        val = float(input(f"  {dim} [0-1]: ") or "0.2")        weights.append(val)     total = sum(weights)    weights = [w / total for w in weights]  # 归一化保证和为1     results = [(arch.name, arch.weighted_score(weights)) for arch in candidates]    results.sort(key=lambda x: x[1], reverse=True)     print("\n架构推荐排序:")    for name, score in results:        print(f"  {name}: {score:.2f}")     print(f"\n最推荐:{results[0][0]},得分 {results[0][1]:.2f}") if __name__ == "__main__":    main()
目的:这是一个交互式架构选型决策脚本,它会读取你对五个维度的权重输入,计算各种架构的加权总分,帮助你用数据而非直觉做选择。
  1. class Architecture:用一个类封装候选架构的名称和它在各维度上的得分,相当于每个候选模式的名片。
  2. weighted_score(self, weights)实现了公式 \(S = \sum w_j s_j\),把维度得分按权重累加。
  3. dims = [...]定义五个评估维度,顺序必须与每个Architecture的scores一致,类似决策表头的列名。
  4. weights = [w / total for w in weights]对用户输入做归一化,防止五个权重之和不等于1导致分数失真。
  5. results.sort(key=lambda x: x[1], reverse=True)按总分降序排序,输出推荐次序,让你一眼看到综合得分最高的架构。

常见误区

误区我看到大厂都在用微服务,所以我的AI项目也应该上来就拆微服务,否则就是技术落后。

正解微服务只是工具而不是勋章。单体架构在团队小、业务简单的阶段,开发和维护效率反而远高于微服务。就像一个人的小面馆,非得分十个岗位反而拖慢速度。架构选型要看业务复杂度和团队规模,小系统强行微服务会掉进“分布式怪物”的坑。

为何常见:大厂技术分享的聚光灯总是打在复杂架构上,而很少宣传那些用单体稳定运行多年的业务,于是形成“越复杂越厉害”的错觉。

误区只要我在系统里引入了Kafka,就算事件驱动架构了。

正解消息队列是基础设施,事件驱动是一种设计思想:事件是一等公民,各服务通过发布/订阅解耦,而不是通过点对点RPC请求响应。就像装个传菜铃不等于就实现了异步协作,关键要看后厨是否真的按铃出餐、按铃传菜,而不是仍有人在窗口喊话。

为何常见:很多团队把技术组件等同于架构模式,忽略了“事件”这个抽象层和配套的最终一致处理机制,导致只买车不修路。

误区我把AI处理拆成清洗、特征、推理三个阶段,并用消息队列连起来,它就会自动并行加速。

正解流水线的并行收益依赖于多个请求同时在管道中流动,且各阶段耗时要相对均衡。如果所有请求都挤在同一个批处理阶段,或者阶段间强同步等待,那么流水线退化成串行。管道模式的真正提速来自“边洗边切”的流畅衔接,而不是简单的工具拼接。

为何常见:人们容易把流程图上的“阶段”等同于时间上的“重叠执行”,却忽略了实际调度和同步开销带来的约束。

误区我现在就要设计一套完美架构,未来三五年都不用变。

正解架构是活的生命体,应随业务演进。好的做法是先选最能满足当前和近六个月的方案,然后留出演进空间。比如先用单体快速验证,再按需将热点服务拆成微服务。试图一次性建起罗马城,只会得到一堆没人用得上的豪华空房间。

为何常见:技术人容易用“能不能应对未来”来证明自己的远见,但过度设计带来的复杂度和成本其实会拖慢产品迭代,最后根本走不到未来。

面试题

Q1. 单体架构最突出的优势是什么?

单选题 · easy

  • A.无限水平扩展
  • B.开发和部署简单← 正确答案
  • C.服务间完全隔离
  • D.故障自动恢复

答案:B。单体把所有功能放进一个进程,启动、调试、部署都最省事,适合快速原型。它无法无限扩展,也不存在服务隔离,故障恢复需要自建,所以选B。

Q2. 微服务架构中,服务数量从4增加到8,两两连接数的理论最大值从多少变为多少?

单选题 · easy

  • A.6 变成 28← 正确答案
  • B.6 变成 16
  • C.12 变成 56
  • D.8 变成 24

答案:A。连接数公式为N×(N-1)/2。N=4时是6,N=8时是28。通信开销随服务数平方级增长,这正是微服务的主要成本,选A。

Q3. 事件驱动架构中,利特尔法则 L=λ×W 说明什么?

单选题 · mid

  • A.消息大小与延迟成正比
  • B.队列长度只由消费速度决定
  • C.平均排队长度等于到达速率乘以等待时间← 正确答案
  • D.事件越少,系统越快

答案:C。利特尔法则表明队列中的平均消息数由到达速率和等待时间共同决定。它用于估算事件积压和系统容量,不涉及消息大小或消费速度单独影响,故选C。

Q4. 管道流水线中,瓶颈工序耗时30毫秒,其他工序各10毫秒,该流水线的最大吞吐约为多少?

单选题 · mid

  • A.每分钟2000个
  • B.每秒33个← 正确答案
  • C.每秒100个
  • D.每秒10个

答案:B。流水线吞吐量由最慢工序决定,Q=1/30ms,即每秒约33.3个请求。其他工序更快也无法突破瓶颈限制,选B。

Q5. Kappa架构相对于Lambda架构的核心差异是什么?

单选题 · hard

  • A.使用多套流处理引擎
  • B.统一用流处理,通过流回放实现批量计算← 正确答案
  • C.完全舍弃实时处理
  • D.增加批处理层保证准确性

答案:B。Kappa架构只保留流处理层,需要批量结果时将数据流回放重新计算,避免了Lambda架构双套代码的维护成本。它并不舍弃实时性,也不保留独立批处理层,选B。

Q6. 当使用加权评分公式 S=Σw_j·s_j 做架构选型时,权重之和通常应满足什么?

单选题 · easy

  • A.必须大于1
  • B.必须小于1
  • C.等于1,以便综合分可比较← 正确答案
  • D.等于100,表示百分比

答案:C。权重归一化成总和为1,能保证各候选架构的综合分在统一量纲下比较。如果和不为1也可以算,但分数会失真,不利于横向对比,选C。

Q7. 以下哪些是微服务架构的典型缺点?

多选题 · mid

  • A.服务间网络通信延迟← 正确答案
  • B.部署单元过于独立
  • C.运维监控复杂度上升← 正确答案
  • D.代码仓库必须单仓库

答案:AC。微服务将系统拆分为网络调用的多进程,通信延迟和运维复杂度是公认缺点。部署单元独立是优点而非缺点;代码仓库可以是多仓库,也并非必须单仓库,所以选A和C。

Q8. 事件驱动架构中,为应对最终一致性和故障追溯,通常需要以下哪些配套能力?

多选题 · mid

  • A.事件持久化存储← 正确答案
  • B.消息追踪ID← 正确答案
  • C.强一致分布式事务
  • D.事件回放机制← 正确答案

答案:ABD。事件驱动采用最终一致,需要持久化事件、给消息分配追踪ID,并支持回放以便查错和补偿。强一致事务与事件驱动思想相悖,一般不用,故选A、B、D。

Q9. 关于架构组合与反模式,以下说法正确的是?

多选题 · hard

  • A.多种模式混用必须定义清晰边界← 正确答案
  • B.模式越多系统越可靠
  • C.依赖地狱源于组件间无节制的耦合← 正确答案
  • D.分布式怪物指服务拆分过碎导致请求链路过长← 正确答案

答案:ACD。架构组合讲究边界,模式越多反而增加复杂度,故B错误。依赖地狱确实是组件耦合失控,分布式怪物也确实是过度拆分。A、C、D描述正确,选ACD。

Q10. 架构选型时,最不应该采取的决策方式是什么?

单选题 · easy

  • A.按业务需求权衡各模式优劣
  • B.直接选用最新最流行的架构← 正确答案
  • C.评估团队技术储备
  • D.先小范围原型验证

答案:B。紧跟流行而没有审视业务和团队,是典型的技术冲动。合理决策应基于需求、能力和验证。所以最不该做的便是B。