实战:防止微服务雪崩传播
引言:一场真实的雪崩事故 2018年某电商平台的双11大促,凌晨2点,一场噩梦开始了: 2:00 - 商品详情服务的MySQL数据库出现慢查询,响应时间从10ms飙升到5秒 2:02 - 商品服务的Tomcat线程池被耗尽(200个线程全部阻塞在数据库查询上) 2:03 - 订单服务调用商品服务超时,订单服务的线程池也被耗尽 2:04 - 用户服务调用订单服务超时,用户服务也挂了 2:05 - 整个系统瘫痪,首页无法访问,交易全部失败 损失:10分钟内损失订单超过5000万元 这就是微服务雪崩效应的真实案例。 一个数据库的慢查询,像多米诺骨牌一样,导致整个系统崩溃。 今天我们就来学习如何用Sentinel防止这种雪崩的发生。 场景描述:一个典型的调用链路 系统架构 我们有一个典型的微服务架构: 用户请求 ↓ [用户服务 User-Service] ↓ 调用 [订单服务 Order-Service] ↓ 调用 [商品服务 Product-Service] ↓ 查询 [MySQL数据库] 调用关系: 用户服务 → 订单服务:查询用户的订单列表 订单服务 → 商品服务:查询订单中的商品详情 商品服务 → MySQL:查询商品信息 正常流程 用户访问"我的订单"页面 用户服务调用订单服务的/order/list接口 订单服务返回订单ID列表 订单服务调用商品服务的/product/detail接口,批量查询商品信息 商品服务查询MySQL数据库 层层返回,用户看到订单列表 正常情况下的响应时间: 商品服务查询数据库:10ms 订单服务调用商品服务:50ms 用户服务调用订单服务:100ms 用户看到页面:200ms 问题分析:雪崩是如何发生的? 故障起点:商品服务的数据库慢查询 某天凌晨,商品服务的MySQL数据库出现了慢查询: -- 慢查询:全表扫描,耗时5秒 SELECT * FROM product WHERE category = 'phone' AND price > 5000 ORDER BY sales DESC; 直接影响:商品服务的响应时间从10ms飙升到5秒。 ...