00:00 / 01:44
连播
清屏
智能
倍速
点赞35
00:00 / 00:07
连播
清屏
智能
倍速
点赞55
00:00 / 03:48
连播
清屏
智能
倍速
点赞11
00:00 / 02:19
连播
清屏
智能
倍速
点赞30
00:00 / 00:22
连播
清屏
智能
倍速
点赞0
#性能优化 案例七:API网关缓慢——盲目增连接,忽略了N+1的微服务版 一个微服务架构下的聚合查询API,比如查询订单详情,需要拉取用户、商品、物流等多个信息。某天,这个接口响应变得缓慢,数据库压力不大,但应用服务器负载很高。 开发团队的反应是网络调用开销太大!于是他们为每个下游微服务的客户端都配置了独立的连接池,并大幅增加连接数。 同时,在代码层增加了异步编排逻辑,试图让调用并行起来。 结果下游部分承载力较弱的核心服务——比如用户基础信息服务——因为连接数被耗尽而崩溃,引发全链路瘫痪。异步逻辑增加了问题排查的复杂度,根本不知道是哪里先出的问题。 根本原因到底是什么? 这是N+1查询问题在微服务间的翻版!这个聚合API为了构造一个完整的响应,对每个订单项都可能发起一次独立的RPC调用去获取商品详情。 100个订单项,就产生100次调用。增加连接池,只是让“请求洪水”更顺畅地冲垮了下游服务。 第一性原理启示:分布式系统的性能包括两条:减少远程调用次数,尊重下游服务的承载力。你给再多连接,也解决不了“调用次数爆炸”的问题。 正确的优化方向: 服务端聚合:在提供数据的微服务侧,提供批量查询接口。比如,对获取产品ID,不要提供一个单条接口,而是提供一次查询多条的批量接口,一次传入100个ID,返回100个商品信息。 数据冗余与CQRS:在合理的一致性级别下,将高频查询所需的数据,冗余到读库或缓存中。比如,订单详情页需要展示商品名称和图片,完全可以在订单服务本地冗余一份商品快照,避免实时调用商品服务。 调用链分析:先使用APM工具(比如SkyWalking、Zipkin)分析问题,看看到底是谁在调谁,调了多少次,每次多久。而不是盲目调整连接参数。 【总结】 盲目增连接,忽略了N+1的微服务版 微服务架构下,最贵的不是连接数,而是调用次数。一次批量查询,胜过一百次单条调用。
00:00 / 03:10
连播
清屏
智能
倍速
点赞4
00:00 / 00:27
连播
清屏
智能
倍速
点赞2
00:00 / 00:21
连播
清屏
智能
倍速
点赞2
00:00 / 00:26
连播
清屏
智能
倍速
点赞0
00:00 / 00:23
连播
清屏
智能
倍速
点赞2
00:00 / 00:33
连播
清屏
智能
倍速
点赞4
00:00 / 06:46
连播
清屏
智能
倍速
点赞2004
00:00 / 00:51
连播
清屏
智能
倍速
点赞31
00:00 / 00:23
连播
清屏
智能
倍速
点赞1
00:00 / 00:26
连播
清屏
智能
倍速
点赞1
00:00 / 07:11
连播
清屏
智能
倍速
点赞20