老王经营着一家生意红火的食堂,起初只有一个中央厨房。做酸辣粉的辣椒油和做蛋糕的奶油堆在同一排架子上,改一道菜品的配方,整个厨房都要停工三天;来一个新厨师,要熟悉所有菜品的做法才能独立上岗。当食堂从 1 家店扩张到 10 家分店时,这个“大锅炉”终于撑不住了。老王狠下心,把中央厨房拆成了一个个独立档口:麻辣烫窗口、拉面窗口、烤肉饭窗口……每个档口有自己的灶台、菜单和厨师长,通过统一的总收银台接单,档口之间用传菜窗口配合。这个从“一个大厨房”到“多个独立档口”的改造,正是微服务架构的核心思想——把一个笨重的单体应用,拆分成多个独立部署、独立演进、独立扩展的小服务,让每个服务各管一摊、各司其职。
微服务拆分是后端工程师走向架构师的必修课,掌握它能让你设计出高扩展、易维护的系统,在技术规划与团队协作中拥有全局视角。
目录
可视化演示
展示单体→微服务DDD限界上下文拆分、服务间通信与API网关模式、以及Saga分布式事务补偿流程。切换模式探索微服务架构设计。
本节配有交互动效(进入视口后自动加载,约 3KB)。
DDD限界上下文服务拆分 单体应用按业务能力拆分为独立服务,每个服务拥有独立数据库和技术栈 限界上下文定义服务边界,边界内高内聚聚合,服务间低耦合通信 split = monolith → services(bounded_context, own_db) DDD拆分是微服务架构的核心决策
拆分的价值:从中央厨房到独立档口
老王的食堂最初只有一个中央厨房,菜品越加越多,厨房里挤满了厨具和食材。做酸辣粉的辣椒油和做蛋糕的奶油堆在同一排架子上——改一道菜品的配方,整个厨房都要停工三天;来了新厨师,要熟悉所有菜品的做法才能独立上岗。更头疼的是,每次晚高峰,客人们想吃麻辣烫,可整个厨房都在忙着做烤肉饭,谁也顾不上。这就是单体应用的真实写照:所有功能模块挤在同一个代码库、同一个进程里,代码耦合、互相牵制、牵一发动全身。
所谓“拆分”,就是把一个代码库按业务领域切成多个独立的服务,每个服务拥有自己的数据库、自己的代码仓库、自己的部署管道。就像老王把中央厨房拆成独立的麻辣烫窗口、拉面窗口和烤肉饭窗口,每个档口有自己的灶台、菜单和厨师长。拆分的红利是实实在在的:其一,独立部署——拉面窗口想上新品,不用通知烤肉饭窗口停工,各改各的、各发各的;其二,独立扩展——麻辣烫窗口排队太长,单独多开两个特许窗口,其他档口不受影响;其三,团队自治——每个档口由厨师长全权负责,决策链条缩短,效率自然提升。这种水平扩展的能力,可以用一个简单的公式来描述:
1. 实例数量 n:同一个微服务可以启动的副本数,比如把拉面窗口从 1 个开到 6 个
2. 扩展损耗系数 β:实例之间通信、数据同步等协作带来的额外开销比例,β 越接近 0 说明系统设计得越“松耦合”
3. 扩展加速比 S(n):开 n 个实例之后,整个系统处理能力相对单实例的倍数
4. 理想极限:当 β 趋近于 0 时,S(n) 接近 n,即完美线性扩展;当 β 较大时,实例再多,收益也会被协调开销吃掉
拆分的意义正在于此:让系统的扩展能力从“一台机器的上限”变成“近乎线性的水平增长”。就像美食广场的客流再多,也只需要按档口增加人力与灶台。但请注意,拆分不是免费的午餐——服务变多,协作的复杂度也会上升,这正是后面每一节要解决的问题。
拆分原则:用领域地图画红线
食堂改造的第二天,老王拿着纸笔画档口分布图。他面临一个难题:怎么分才算合理?按做菜速度分?按食材分?结果发现怎么分都有问题——做菜快的和做菜慢的用同一口锅,用辣椒的档口不卖甜点,但甜点师傅要过来借烤箱。老王最后想明白了:划分档口的依据不是“工具”或“食材”,而是菜系和业务场景——川菜档口、粤菜档口、甜点档口,每个档口服务一类菜系,从采购、备菜到上菜全流程闭环。
在微服务架构里,这条划分的红线就是领域驱动设计(DDD)。DDD 的核心是找到系统中的“限界上下文”——每一块独立的业务领域拥有自己的模型和语言,比如电商系统可以划分为商品、订单、支付、库存、用户等多个上下文。每个限界上下文对应一个微服务,服务内部的类、函数之间高度内聚,服务之间通过明确定义的接口协作。判断一个拆分是否合理的常用度量是模块内聚度——服务内部的元素之间关联越紧密,说明这个服务越是“一条心”:
1. 模块内元素数 N:一个微服务内部包含的类或函数数量
2. 内部关联数 E:这些元素之间互相调用的关系数量
3. 最大可能关联数:N 个元素两两相连最多有 N(N−1)/2 条有向边
4. 内聚度 C:实际关联数占最大可能关联数的比例,C 越接近 1,说明服务内部元素绑定越紧、越该待在一起
依据 DDD 划分后,服务与业务能力一一对应,每个服务由一支团队“包产到户”。同时要注意粒度控制:初期宁大勿小,先按中等粒度拆,拆得太碎会导致运维成本爆炸。还要做边界防腐:服务之间不能直接访问对方数据库,只能通过接口对话——就像档口之间不能随便翻对方的货架,要借东西必须走传菜窗口。只有守住边界,拆出来的服务才不会重新纠缠成一团。
服务通信:档口之间怎么打招呼
档口虽然独立了,但顾客点一份“麻辣烫配一份隔壁档口的酸梅汤”,两台灶台就得配合。老王设计了三种协作方式:传菜窗口——麻辣烫师傅做好后直接递到饮品窗口,这是同步调用,速度快但要等着;对讲机——饮品窗口喊一嗓子“酸梅汤马上好,稍等送到”,这是异步消息,两边各干各的;便签——每个档口的菜单用统一格式贴在窗口,这是接口契约,加菜必须按格式写,不能自己发挥。
对应到技术世界,微服务通信主要分两类。同步通信以 REST/HTTP 或 gRPC 为主,适合需要立即拿到结果的场景(如查询订单详情);异步通信以消息队列(Kafka、RabbitMQ、RocketMQ)为主,适合削峰填谷、事件通知的场景(如下单后通知物流)。实践中两者组合使用:核心链路用异步解耦,查询类操作用同步调用。无论哪种方式,接口契约都要严格管理——接口变更必须向后兼容,升级要遵循版本化发布。
这里有个容易忽略的坑:同步调用链越长,系统整体可用性越低。假设每个服务的可用性都是 99.9%,三个服务串联后,整体可用性会明显下跌:
1. 单服务可用性 A_i:某一个微服务正常运行的概率,比如 99.9% 写成 0.999
2. 链路总可用性 A:一次请求串行经过 n 个服务都成功的概率,等于各服务可用性的乘积
3. 三个服务串联实例:若三个服务可用性分别为 99.9%、99.5%、99%,则总可用性骤降到约 98.4%
4. 核心结论:链路总可用性低于链条中最差的一环,因此要尽量缩短同步链路、用异步削峰,并加入超时重试与幂等保护
回到食堂:如果顾客点个套餐要依次经过三个窗口、每个窗口都可能临时关门,那体验一定糟糕。所以老王规定:跨档口的复杂流程一律用小纸条(异步消息)传递,每个窗口收到纸条必须先回一句“收到”(确认机制),确保单子不丢。这就是微服务通信的智慧——能异步就别同步,能确保投递就别只靠运气。
API网关:美食广场的总收银台
档口多了,新的问题来了:顾客进广场,不知道该去哪个窗口下单;每个窗口都自己收银,账容易乱;晚上八点人流量爆满,窗口忙不过来,饭菜质量下降。老王于是在广场入口设了一个总收银台——顾客只到总台点单付款,总台把单子分发给对应档口,档口做好后喊号取餐。这个总台,就是微服务架构中的 API 网关。
API 网关是系统的统一入口,承担四件事。一是统一路由:根据请求路径分发到正确的服务(/api/order 去订单服务,/api/pay 去支付服务)。二是认证鉴权:在入口统一验票,拦截非法请求,业务服务只需要信任网关传递的用户信息。三是限流熔断:当流量超过系统承载能力,网关主动丢弃多余请求或触发熔断,保护下游服务不被冲垮。四是协议转换:把客户端的 HTTP/JSON 请求转换成后端服务需要的格式,屏蔽内部实现细节。
网关的吞吐能力是有数学规律的,它就是排队论中的 Little's Law:
1. 平均响应时间 \bar{T}:一个请求从进网关到返回响应的平均耗时,单位一般用秒
2. 并发数 L:同一时刻系统内正在处理的请求总数,相当于总收银台同时接待的顾客数
3. 吞吐量 QPS:每秒通过网关的请求数,等于并发数与平均响应时间的比值
4. 限流应用:假设测得平均响应时间 0.2 秒,想把 QPS 限制在 1000,则需要把并发数控制在 200
所以限流熔断不是随意拍的数值,而是基于系统真实响应时间算出来的保护线。就像总收银台一旦发现排队超过一定人数,就限流入场、优先保障已进场的顾客体验。API 网关让客户端只认识一个入口,也让服务方只需要信任一道防线——它是微服务体系的护城河。
分布式事务:跨档口套餐怎么对账
美食广场推出一款“超值套餐”:拉面窗口的招牌拉面 + 小菜窗口的爽口凉菜。顾客在总台下单后,两个窗口需要同时备餐。问题来了:如果拉面做好了,凉菜窗口却说食材卖完了——套餐怎么办?让顾客只端着拉面走,套餐名不副实;让拉面窗口也把面倒掉,损失谁来担?在单机数据库里,我们可以用事务保证“要么都成功,要么都失败”,但在分布式系统中,数据分散在不同服务的数据库里,本地事务管不到别人的库。
微服务领域解决这个问题靠的是“最终一致性”——不追求瞬时强一致,而是通过异步机制保证一段时间后数据逐步对齐。常用的方案有三种:本地消息表——拉面窗口在本地库中写入一条“待通知凉菜窗口”的消息表记录,定时扫描、投递消息,凉菜窗口处理后回执,没处理就重发,配合对账兜底;事务消息——消息队列(如 RocketMQ)把消息暂存为半消息,业务成功后再确认提交,保证业务与消息原子性;Saga 模式——把一个长事务拆成多个带补偿操作的本地事务,第 k 步失败后,依次执行前 k−1 步的补偿操作,撤销已完成的影响。
无论哪种方案,跨服务协调都要付出时间成本。Saga 模式的总耗时是所有本地事务步骤的累加:
1. 单步耗时 t_i:Saga 流程中第 i 个本地事务(如“扣减库存”)的执行时间
2. 串行总耗时 T:n 步全部执行完成所需的总时间
3. 失败补偿成本:当第 k 步失败,需要回滚前 k−1 步,额外耗时等于前序每一步耗时的总和
这就是为什么设计分布式事务时要尽量缩短参与的服务数量、精简流程步骤。回到食堂:老王最终规定,套餐类订单先在总台锁定“凉菜档口库存”(本地事务),再做拉面,凉菜做完后异步通知总台完成订单(消息+对账)。如果凉菜真的做不出来,就自动给顾客退凉菜的差价并赔偿优惠券——这是“补偿”的艺术。分布式事务没有银弹,能绕开跨服务事务的耦合,就不要硬做。
注册配置:招牌、导览图与布告栏
美食广场越做越大,不少档口开了分铺:麻辣烫在 1 号门和 3 号门各有一个窗口。顾客总台要发单,得知道每个档口当前在哪个位置、是否营业。老王为此做了一张导览图(注册中心):每个档口开张时把“档口名+位置+营业状态”登记上去(服务注册),关张时摘掉(服务下线),营业期间每隔几分钟向导览员点点头报个到(心跳续约)。顾客想点餐,先查导览图,再找最近且营业中的窗口下单。
在微服务架构中,这个“导览图”就是注册中心(如 Nacos、Eureka、Consul)。每个服务实例启动时向注册中心注册自己的 IP 和端口,随后以一定间隔发送心跳;注册中心发现心跳超时就剔除该实例。服务消费者通过注册中心拿到可用实例列表,再用负载均衡策略选择其中一个发起调用。常见的负载均衡策略有加权轮询、最小连接数等——每个实例的权重可以按机器配置设定:
1. 实例权重 w_i:每一台服务实例被分配的权重值,配置高的机器可以给更大权重
2. 总权重和:当前所有可用实例的权重加总
3. 选择概率 P_i:负载均衡器把请求调度到实例 i 的概率,权重越大、被分配到的流量越多
4. 动态权重调整:根据实例的实时 CPU、连接数等指标动态调整权重,实现自适应负载均衡
除了服务发现,微服务体系还有个“布告栏”——配置中心。档口的菜价牌、营业时间、优惠策略统一写在布告栏上,而不是贴在各个档口墙上。改菜价只需在布告栏改一次,所有档口自动同步。对应到技术层,配置中心把服务的配置从代码和本地文件中抽离出来统一管理,支持动态刷新,配合注册中心实现优雅升级。配置跟着环境走,服务地址跟着注册中心走,这就是微服务基础设施的两大支柱。
监控治理:食品安全检查站
档口多了,老王最担心的是“看不全”:某个窗口的食材过期了没人发现,某条出餐线路堵了却不知道堵在哪个环节。于是他请了一支监督检查队:每个档口每天提交经营日报(日志聚合),在关键节点安装“记录仪”追踪每份套餐从下单到出餐的全流程(链路追踪),每天开门前做一次卫生与设备检查(健康检查),新品上线先试卖三天再全量推广(灰度发布)。
微服务架构下,监控治理是系统稳定性的最后防线。日志聚合(ELK 技术栈)把散落在成百上千个服务中的日志集中收集、索引、检索,解决“日志在哪看”的问题;链路追踪(Jaeger、Zipkin、SkyWalking)为每个外部请求生成唯一的 traceId,贯穿所有服务节点,解决“慢请求卡在哪个服务”的问题;健康检查不仅要检查进程是否存活(TCP 探活),还要检查业务自检接口(如 /health)是否返回正常,解决“进程活着但服务不可用”的问题;灰度发布则让新版本先在一小部分实例上运行,观测指标平稳后再全量发布,解决“新版上线即事故”的问题。
这一切的最终目标,是守住系统的 SLA(服务可用性协议):
1. 统计周期总时长 T:监控考察的时间范围,如一年为 365 × 24 小时
2. 故障累计时长 D:统计周期内服务不可用的累计时间,包括宕机、重启、严重性能劣化等
3. 可用率:可用时间占总时间的百分比,即总时间减去故障时间除以总时间
4. SLA 预算:想达到 99.9%,一年最多允许的故障时长为 8760 × 0.1%
好的监控治理像食堂的“明厨亮灶”——每一项操作都被记录、每一步都可回溯、任何一个档口的异常都能在几分钟内被发现。服务拆得开,更要看得见。当系统出问题时,链路追踪能告诉你“一碗拉面 3 秒出餐,8 秒都在等酸梅汤窗口的回应”,日志聚合能告诉你在那一刻酸梅汤窗口发生了什么。微服务架构的上限由拆分设计决定,下限由监控治理兜住。
AI 应用场景
场景一:AI 推理服务独立弹性伸缩
阶段:模型部署与在线推理
解决的问题:传统单体应用中,GPU 密集的 AI 推理代码和 Web 业务代码打包在一起,扩容只能整机复制,GPU 被普通请求白白占用;拆成微服务后,AI 推理服务可以单独扩容——大促时 GPU 档口多开几个,普通业务档口不动。
具体案例:某智能客服系统的语音识别(ASR)模型起初集成在单体应用中,上线高峰期整机 CPU 打满、GPU 空转。团队把 ASR 推理拆成独立微服务并接入配置中心,GPU 实例按队列深度自动扩缩容,大促时扩容到 8 卡 GPU,流量回落后自动缩容,季度计算成本下降 40%。
场景二:推荐系统的服务化拆分
阶段:特征工程与模型推理链路
解决的问题:推荐链路包含召回、粗排、精排、重排多个环节,每个环节由不同算法团队迭代。若耦合在一个服务里,A 团队改召回策略,B 团队的精排也得跟着回归测试;拆成独立微服务后,每个环节独立发布、独立扩缩容。
具体案例:某内容 App 将推荐链路按“召回→粗排→精排→重排”拆成四个微服务,消息队列串联各环节,特征平台统一提供实时特征。新增一种召回策略只需单独发布召回服务并通过开关灰度,精排服务不受影响,策略迭代周期从 2 周缩短到 2 天。
场景三:AI 辅助的全链路根因分析
阶段:智能运维(AIOps)
解决的问题:微服务数量动辄上百,故障定位像大海捞针;基于链路追踪与日志聚合的 AI 根因分析,能自动把 traceId 串联的调用链异常服务标记出来,缩短平均故障恢复时间(MTTR)。
具体案例:某电商平台在双十一大促中启用 AIOps 平台:SkyWalking 采集全链路 trace,日志聚合到 ELK,AI 模型对异常指标聚类并输出根因候选服务。一次下单链路超时问题,AI 在 4 分钟内定位到“库存服务的 Redis 连接池打满”,而人工排查通常需要 30 分钟以上。
Python 演示
"""微服务调用链路模拟:演示串联调用可用性下降,并用重试机制提升成功率。"""import randomimport time SERVICE_LATENCY = {"order": 0.02, "stock": 0.015, "payment": 0.03}SERVICE_AVAILABILITY = {"order": 0.999, "stock": 0.995, "payment": 0.99} def call(service): """模拟一次远程调用,按可用性概率随机失败""" if random.random() > SERVICE_AVAILABILITY[service]: raise ConnectionError(f"{service} 服务不可用") time.sleep(SERVICE_LATENCY[service]) return True def call_with_retry(service, retries=2): """带重试的调用,短时抖动可被重试吸收""" for attempt in range(retries + 1): try: call(service) return True except ConnectionError: if attempt == retries: raise def create_order(): """订单服务串行调用库存与支付,并计算链路可用性""" start = time.perf_counter() chain_avail = 1.0 for svc in ["order", "stock", "payment"]: chain_avail *= SERVICE_AVAILABILITY[svc] call_with_retry(svc) elapsed = (time.perf_counter() - start) * 1000 return elapsed, chain_avail if __name__ == "__main__": print("=== 微服务下单链路模拟(order → stock → payment)===") for _ in range(4): try: elapsed, avail = create_order() print(f"下单成功 耗时={elapsed:.1f}ms 链路可用性={avail:.4f}") except ConnectionError as e: print(f"下单失败: {e}") a = SERVICE_AVAILABILITY total = a["order"] * a["stock"] * a["payment"] print(f"理论串联可用性 = {a['order']} × {a['stock']} × {a['payment']} = {total:.4f}")
SERVICE_AVAILABILITY = {"order": 0.999, "stock": 0.995, "payment": 0.99}定义每个服务的可用性,就像每个档口的“营业正常率”if random.random() > SERVICE_AVAILABILITY[service]:按可用性概率模拟随机失败,random 在 0-1 之间均匀分布chain_avail *= SERVICE_AVAILABILITY[svc]串联链路的可用性是各个环节相乘,验证正文中的公式call_with_retry(svc)失败后重试最多两次,模拟实际系统的容错重试机制
常见误区
误区初学者认为微服务就是“拆”,拆得越多越彻底,每个接口都独立成一个服务,甚至一个类一个服务。总觉得拆得越细,系统就越“微服务”。
正解服务粒度要按业务领域划分,而不是按代码量或功能点划分。拆得太碎会带来三个灾难:服务间远程调用爆炸、分布式事务满天飞、运维监控成本飙升。一个合理的服务应该是一个完整的业务能力闭环,比如“订单服务”而不是“订单查询服务”加“订单创建服务”。就像美食广场不会把“洗菜”和“切菜”各开一个档口。
为何常见:很多人把“微”理解成“小”,忽略了微服务的本质是“独立部署、独立演进”,而不是单纯的代码规模小。
误区既然单体应用里所有模块都用同一个数据库,那微服务之间也共用一个数据库好了,反正数据都在一起存储,为什么非要分开?
正解共享数据库是微服务最常见的“伪拆分”。两个服务共享同一张表,就等于两个档口共用一个冰箱,一个档口改库存,另一个档口的数据全乱了。微服务的核心铁律是“数据私有、接口开放”——每个服务拥有自己的数据库,对外只通过 API 暴露能力。共享数据库会毁掉边界防腐,最终退化成“分布式单体”。
为何常见:拆分代码容易,拆分数据难。数据是系统最核心的资产,开发者担心拆库后查询不便、事务难做,于是选择共享数据库这条“捷径”。
误区很多开发者习惯单机数据库的事务,以为微服务环境下也可以用两阶段提交(2PC)实现强一致,如果不能就认为系统不合格。
正解分布式环境下,网络分区是不可回避的现实,追求强一致意味着牺牲可用性(CAP 理论)。在微服务实践中,绝大多数场景接受最终一致性:通过本地消息表、事务消息、Saga 模式,让数据在秒级甚至分钟级对齐,再辅以对账兜底。只有极少数资金类强一致场景才考虑分布式锁或 2PC。不要用单机的世界观硬套分布式系统。
为何常见:事务语义是关系型数据库几十年教育的思维惯性,把"ACID"当作唯一正确答案,忽略了分布式系统中一致性、可用性、分区容错性三者不可兼得。
误区把服务拆出去、注册到 Nacos,线上跑得“看起来挺稳”,就认为微服务治理工作已经结束了。
正解注册发现只是微服务治理的第一步。服务拆出去之后,调用链跨了进程、跨了机器,出问题时定位难度指数级上升。必须配套链路追踪、日志聚合、健康检查和监控告警,形成“发布→运行→观测→优化”的闭环。很多团队拆完服务上线就松懈,等线上出故障才发现连 traceId 都没串起来,排障全靠人肉翻日志。
为何常见:微服务的建设节奏通常是“先拆后治”,运维治理建设滞后于拆分,加上监控本身工作量大、见效慢,容易被拖延。
面试题
Q1. 微服务拆分的首要依据是什么?
- A.代码行数最少优先
- B.业务领域边界← 正确答案
- C.团队人数平均分配
- D.数据库表数量
答案:B。微服务拆分的第一原则是按业务领域(DDD 限界上下文)划分,而不是按代码量、人数或数据表。就像美食广场按菜系开档口,不会因为某档口菜做得多就硬切成两半。
Q2. API 网关在微服务架构中的核心职责是什么?
- A.持久化存储业务数据
- B.统一请求入口与转发← 正确答案
- C.定时执行批处理任务
- D.编译打包部署代码
答案:B。API 网关负责统一路由、鉴权、限流和协议转换,是系统的总收银台。存储数据是业务服务的职责,批处理和编译部署都不是网关的事。
Q3. 微服务之间最常用的同步通信方式是哪种?
- A.REST/HTTP 接口调用← 正确答案
- B.共享内存读写数据
- C.直接操作对方数据库
- D.定时批量文件传输
答案:A。REST/HTTP 是微服务间最常见的同步调用方式,像传菜窗口直接递菜。共享内存和直接操作对方数据库破坏边界,批量文件传输属于异步批处理手段。
Q4. 在 DDD 中,限界上下文的核心作用是什么?
- A.限制代码仓库的大小
- B.划定领域模型的边界← 正确答案
- C.限定数据库连接数量
- D.约束接口返回的字段数
答案:B。限界上下文定义了业务模型的适用范围和语言边界,在边界内部模型自洽,通过接口与外部协作。它类似档口与档口之间的隔断墙,不是为了限制代码大小或数据库连接。
Q5. 服务注册中心通过什么机制判断实例已下线?
- A.定期心跳超时判定← 正确答案
- B.检查配置文件内容
- C.扫描日志文件记录
- D.分析流量统计曲线
答案:A。注册中心靠心跳续约机制判断实例状态——实例定期上报“我还活着”,超过阈值未上报就会被剔除。就像导览图上长期打不了卡的档口会被标记为暂停营业。
Q6. Saga 模式解决分布式事务的核心思路是什么?
- A.加一把全局分布式锁
- B.本地事务序列加补偿← 正确答案
- C.两阶段提交强一致
- D.消息广播全量通知
答案:B。Saga 把长事务拆成多个本地事务,每步失败后执行前序步骤的补偿动作,是“做了备份计划的分步执行”。分布式锁不是事务方案,2PC 是强一致方案但不是 Saga 的思路。
Q7. 链路追踪(如 SkyWalking)解决的核心问题是什么?
- A.跨服务请求全局排查← 正确答案
- B.数据库慢查询分析
- C.服务器宕机自动恢复
- D.编译错误的快速定位
答案:A。链路追踪给每个外部请求一个全局 traceId 贯穿所有服务节点,能还原一次请求在哪个服务、哪个环节耗时最长。类似在美食广场给每份套餐装上定位器,知道它卡在哪个窗口。
Q8. 下列哪些措施可以降低同步调用链过长带来的可用性风险?
- A.引入异步消息解耦← 正确答案
- B.设置超时与失败重试← 正确答案
- C.增加熔断与降级保护← 正确答案
- D.无限制排队等待恢复
答案:ABC。异步解耦能缩短同步链路,超时重试能吸收瞬时抖动,熔断降级防止故障级联。无限排队反而拖垮系统,不是容错手段。就像高峰期档口排队,限流比放任排队更健康。
Q9. 关于微服务分布式事务的落地实践,下列说法正确的有哪些?
- A.本地消息表需要定时对账兜底← 正确答案
- B.事务消息由消息中间件保证投递← 正确答案
- C.Saga 适合流程长步骤多的场景← 正确答案
- D.两阶段提交实现简单且无阻塞
答案:ABC。本地消息表和事务消息都依赖异步对账补充,Saga 天然适合长流程。两阶段提交存在同步阻塞和协调者单点问题,实现并不简单。好比跨档口套餐,分步下单加补偿方案比一刀切锁库存更实用。
Q10. 微服务上线后,下列哪些属于正确的可观测性治理实践?
- A.灰度发布新版本小流量试运行← 正确答案
- B.配置中心支持动态刷新参数← 正确答案
- C.日志聚合与链路追踪联动排障← 正确答案
- D.健康检查只用 TCP 端口探测
答案:ABC。灰度发布、动态配置和日志链路联动都是可观测性的正确实践。健康检查仅探测 TCP 端口不够,还要做业务自检(如 /health 接口校验依赖是否正常),否则“进程活着但不干活”仍会漏报。