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

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调整多高,要用线程数模式来兜底一次,当前这个接口,需要最大,最多分配多少线程来提供服务?

相关推荐
小程故事多_8017 分钟前
企业AI对话记忆架构实战,告别单一Redis存储,搭建长短效协同的记忆体系
人工智能·redis·架构
m0_587383001 小时前
24小时自助健身系统源码实战:从架构设计到部署落地
java·架构·系统架构·需求分析
万象观察录2 小时前
微服务架构下的API全生命周期安全防护办法
安全·微服务·架构
万物智能2 小时前
HDMI 输出—【万物智能之开源鸿蒙OpenHarmony系统实战开发系列教程】
后端·架构
yunwei372 小时前
ACRFence:防止 AI Agent 检查点恢复中的语义回滚攻击
人工智能·安全·架构
岁月如歌77862 小时前
顺序消息与幂等消费完全指南:从队列有序到接口幂等
java·后端·架构
NGC22373 小时前
从一份文档到一个回答——RAG到底经历了什么
架构
努力努力再努力wz3 小时前
【Docker入门系列】:从架构演进到容器化:一文建立 Docker、虚拟化与 Namespace 的底层心智模型
运维·开发语言·数据结构·c++·docker·容器·架构
Capricorn19883 小时前
跨端同步与记忆锁定排障:OpenClaw 2.0 Active Memory 云端劫持危机,知芽 Notebook Skill 单元记忆架构解析
大数据·论文阅读·人工智能·笔记·架构·论文笔记
吴佳浩 Alben4 小时前
多智能体系统的通信风暴与死锁治理:生产级降级与容灾方案
人工智能·docker·ai·容器·架构