什么时候外部依赖接口慢拖死应用?

A应用调用B应用,当B应用的接口响应耗时平均都在3000ms的时,如果当前A调用B的请求数达300/s 那么在3s内A应用在途的请求数 = 300 * 3 =900 ,按照servlet原理一个http的请求需要一个线程提供服务,即需要900个线程提供服务,tomcat线程数一般就1500左右,假设数字我们在变一下:

|--------|---------|------------------|------------|
| 耗时 | qps | 3000ms内需要线程数 | 备注 |
| 3000ms | 300 | 900 | 应用争抢cpu |
| 3000ms | 400 | 1200 | 应用基本抢不到cpu |
| 3000ms | 500 | 1500 | 应用完全死机 |
| 4000ms | 300 | 1200 | 应用基本死机 |
| 4000ms | 400 | 1600 | 应用基本死机 |
| 4000ms | 500 | 2000 | 应用完全死机 |

针对上面的场景,为了保护A应用不被外部B应用响应慢拖死,需要合理设置A调用B的接口超时时间,但是B接口的超时是不可避免的,网络随时抖动,B应用可能故障,B应用可能性能瓶颈,A请求量增大导致B扛不住等。所以A做的措施

  1. 设置合理接口超时时间
  2. A调用B设置熔断
  3. 上游调用A设置限流
    1. 注意一定是线参数限流模式,因为qps限流当尖峰流量来的时候,同时遇到B响应慢,则A可能瞬间线参数打满,A直接夯死了

以上问题是我在生产上遇到过的,当时8个实例的应用,B应用耗时3s-4s,瞬间A实例的线参数打打到1500-1600,A的所有实例打死了7个,这个时候调整限流qps,熔断时间等已经来不及,因为应用早已经打死了,只能重启。所以一定要有线程数限流的模式做兜底,不管你qps调整多高,要用线程数模式来兜底一次,当前这个接口,需要最大,最多分配多少线程来提供服务?

相关推荐
用户6919026813393 分钟前
Agent 记忆处理机制详解:从变量数据类型到内存模型
javascript·架构
行者全栈架构师7 分钟前
WorkBuddy 开放平台个人开发者接入实战:从零到 Agent 应用的完整路径
人工智能·架构·代码规范
Apache IoTDB8 分钟前
清华大学软件学院王建民院长:工业时序数智库架构与数据价值魔方
架构
convee_ai9 分钟前
Agent 执行为什么需要独立 Sandbox:拆解 Hullwork 的 gVisor 隔离
架构·kubernetes
FFZero124 分钟前
[mpv架构] (4) demux 线程到底在“预读“什么?
c++·架构·音视频·多媒体
evans在进步28 分钟前
Tomcat 整体架构与启动流程:从 Server 到 Servlet 加载
servlet·架构·tomcat
阡陌数智34 分钟前
高可用LLM服务架构:多模型聚合系统并发管控、限流熔断与降级容错实战
架构
weixin1997010801635 分钟前
[特殊字符]《二手ERP × 闲鱼消息驱动架构:正向+逆向交易消息如何驱动WMS出库与回传》(附Python源码)
开发语言·python·架构
Jay Kay38 分钟前
深入理解 RDMA 内存管理:海思 HNS RoCE 架构中的 HEM 表与 MTR 表有什么区别?
服务器·网络·架构
鲸能云1 小时前
【智慧能源】源储调售一体化架构与 EMS 滚动调度算法实践 —— 工商业光储收益提升 22% 的技术拆解
算法·架构·能源