知识卡片

微服务陷阱三:调用链变长带来的性能损耗与故障定位困难

结构图卡

内容

微服务之间靠HTTP或RPC通信,每次调用都要走一趟网络,这会同时带来两个问题。第一是性能下降:线上业务接口之间的平均响应时间大约50毫秒,如果一次用户请求要串联6次微服务调用,光是这部分调用开销就要300毫秒,这在很多对性能要求高的业务场景下根本无法接受,为了硬扛住这个开销往往只能靠堆更多硬件,直接推高了硬件成本。第二是故障定位困难:拆成微服务后,一次用户请求要靠多个微服务协同处理,任意一个微服务出故障都可能导致整体业务失败,但因为微服务数量多、故障还会沿调用链扩散,快速定位到底是哪个环节出的问题变得很复杂——比如Service C的数据库出现慢查询,导致它给Service B的响应出错,Service B又把错误传给Service A,Service A最终把错误呈现给用户;但真实排查时不会像示意图这么清晰,最初往往只有”用户报错”这一个线索,排查团队通常先查Service A,导致Service A故障的可能原因非常多,可能要花半小时到一小时才发现其实是Service B的响应有问题,于是又要花类似的时间去查Service B,如此层层往下排查,最终定位到根因(Service C的数据库慢查询)可能要耗费好几个小时;如果多个微服务同时出现不同类型的故障(比如Service C数据库慢查询的同时,Service C到Service D的网络又出了问题),要确定到底是哪个原因导致了最终的错误响应,需要投入更多信息收集和人力排查,复杂度进一步叠加。

结构图

flowchart TB
  A["微服务调用链变长的两个后果"]
  A --> B["性能下降<br/>单次调用约50ms,6次调用累计约300ms<br/>为扛住开销只能堆硬件,成本上升"]
  A --> C["故障定位困难<br/>故障沿调用链扩散,排查从用户端逐级往上查"]
  C --> D["案例:Service C数据库慢查询<br/>→C给B返回错误→B给A返回错误→A给用户返回错误<br/>实际排查从A开始逐级倒查,耗时数小时"]
  D --> E["若多个微服务同时出现不同类型故障<br/>(如C数据库慢+C到D网络故障)<br/>排查复杂度进一步叠加"]

参考来源

- 位置:《从零开始学架构》第34讲《深入理解微服务架构:银弹 or 焦油坑?》"微服务的陷阱"之"调用链太长,性能下降""调用链太长,问题定位困难"(源文件:_epub-src/OEBPS/text00003.html) - 结论依据:原文说明"一般线上的业务接口之间的调用,平均响应时间大约为 50 毫秒,如果用户的一起请求需要经过 6 次微服务调用,则性能消耗就是 300 毫秒",并以Service C数据库慢查询引发链式错误响应为例说明"最开始是用户报错……我们可能要花半个小时甚至 1 个小时才能发现是 Service B 返回错误导致的……最后可能花费了几个小时才能定位到是 Service C 的数据库慢查询导致了错误",直接支撑本卡片结论与结构图。 - 原始内容:一般线上的业务接口之间的调用,平均响应时间大约为 50 毫秒,如果用户的一起请求需要经过 6 次微服务调用,则性能消耗就是 300 毫秒……最后可能花费了几个小时才能定位到是 Service C 的数据库慢查询导致了错误。