稳定运行了多年的网关,偏偏让我掉进了坑

本文涉及的产品
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
可观测可视化 Grafana 版,10个用户账号 1个月
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 稳定运行了多年的网关,偏偏让我掉进了坑

背景介绍

在服务刚启动的时候,服务的运行状态并没有达到最佳,如果一下子将流量提升到日常运行的状态,会存在大量的请求超时。

为什么服务刚启动的时候,服务不是最佳状态呢?

  • Java应用类加载是按需加载的,在服务刚启动的时候,只会加载启动过程中需要的类;当服务接口被调用的时候,才会加载、初始化接口用到的类;对于热点代码,存在一个字节码解释执行到本地机器码执行的过程。
  • Java应用需要与依赖的数据库创建连接,与数据库的连接不仅仅是建立一个TCP连接,还涉及用户认证、权限校验、数据库资源分配等,是一个比较耗时的操作。
  • Java应用与依赖的Redis、HSF服务都要做初始化工作… …

为了服务达到最佳状态,我们通过调整服务权重慢慢增加流量,经过一段时间的小流量预热,让系统达到最佳运行状态。

某天我决定干这个事,我将权重由1调整到2,系统正常;由2调整到4,系统正常;将权重调整到9的时候,故障出现了。

故障描述

将权重调整到9,网关将流量都打到了30多台机器上(一共168台机器),接着应用不断发生CMS GC,接口成功率直线下降。

下游没流量的机器

下游机器接口成功率

分析过程

因为提前完全没有想到发生这种情况,一点预案也没有。后来冷静下来,想明白:这不应该是应用侧的问题,调整个权重就被打挂似乎没有这种道理。

系统交互关系

第4步-List<Host>

机器不健康的时候,注册中心会剔除掉问题机器;机器恢复健康后,注册中心会再次将机器加入到列表中,【机器列表的顺序不会改变】。

举例说明:

  1. A1、A2、A3、A4(权重都是1)已经注册到注册中心,状态健康;
  2. A1发送心跳失败(网络超时/服务hang住等原因),client从注册中心获取的机器列表是:A2、A3、A4;
  3. A1发送心跳成功(恢复健康状态),client从注册中心获取的机器列表是:A1、A2、A3、A4。

第5步-构造下游机器列表

网关从注册中心拿到List<Host>后,构造下游机器列表的逻辑:

举例说明:

List<Host>中共有A1、A2、A3、A4四台机器,每台机器权重是3,该方法构造出的下游机器列表是:

[A1,A1,A1,A2,A2,A2,A3,A3,A3,A4,A4,A4]

第6步-选择一台下游机器

当网关收到第一个请求的时候,选择下游机器列表的第一个机器;

当网关收到第二个请求的时候,选择下游机器列表的第二个机器;

依次轮询下游机器列表。

小结

每当某台机器向注册中心发送心跳超时的时候,该接口在注册中心对于的机器列表就会变化;

网关会获取该接口新的机器列表List<Host>,并根据List<Host>重新构造一个新的下游机器列表;

新的请求会按照下游机器列表的顺序轮询发送到后端业务机器上。

故障场景复盘

基本信息

业务应用有168台机器,定义为:A1,A2,A3… …A168;

网关有大概600台机器。

场景复盘

  1. 业务应用将权重调整为【9】;
  2. 网关机器列表(所有网关机器上都是这个列表)变更为:[A1,A1,A1…A1,A2,…A2,…A168,A168,A168…A168],列表中有9个A1,9个A2,9个A3,…,9个A168,计数设置为【0】;
  3. 单台网关机器QPM:300,【2】中数组每台机器对应9个元素,由于网关是轮询策略,所以一分钟的流量【整个集群的】打到了【300/9=33】台机器上;
  4. 由于流量打到了30多台机器上,机器负载迅速增大->发生了CMS GC,系统hang住,进而导致业务应用向注册中心发送心跳失败,注册中心通知网关机器列表变更,流程回到了第【2】步。
目录
相关文章
|
4月前
|
监控 负载均衡 Java
深入理解Spring Cloud中的服务网关
深入理解Spring Cloud中的服务网关
|
1月前
|
安全 5G 网络性能优化
|
2月前
|
监控 负载均衡 安全
微服务(五)-服务网关zuul(一)
微服务(五)-服务网关zuul(一)
|
3月前
|
运维 Kubernetes 安全
利用服务网格实现全链路mTLS(一):在入口网关上提供mTLS服务
阿里云服务网格(Service Mesh,简称ASM)提供了一个全托管式的服务网格平台,兼容Istio开源服务网格,用于简化服务治理,包括流量管理和拆分、安全认证及网格可观测性,有效减轻开发运维负担。ASM支持通过mTLS提供服务,要求客户端提供证书以增强安全性。本文介绍如何在ASM入口网关上配置mTLS服务并通过授权策略实现特定用户的访问限制。首先需部署ASM实例和ACK集群,并开启sidecar自动注入。接着,在集群中部署入口网关和httpbin应用,并生成mTLS通信所需的根证书、服务器证书及客户端证书。最后,配置网关上的mTLS监听并设置授权策略,以限制特定客户端对特定路径的访问。
130 2
|
12天前
|
负载均衡 Java 应用服务中间件
Gateway服务网关
Gateway服务网关
25 1
Gateway服务网关
|
1月前
|
前端开发 Java API
vertx学习总结5之回调函数及其限制,如网关/边缘服务示例所示未来和承诺——链接异步操作的简单模型响应式扩展——一个更强大的模型,特别适合组合异步事件流Kotlin协程
本文是Vert.x学习系列的第五部分,讨论了回调函数的限制、Future和Promise在异步操作中的应用、响应式扩展以及Kotlin协程,并通过示例代码展示了如何在Vert.x中使用这些异步编程模式。
47 5
vertx学习总结5之回调函数及其限制,如网关/边缘服务示例所示未来和承诺——链接异步操作的简单模型响应式扩展——一个更强大的模型,特别适合组合异步事件流Kotlin协程
|
2月前
|
测试技术 微服务
微服务(八)-服务网关zuul(四)
微服务(八)-服务网关zuul(四)
|
2月前
|
监控 前端开发 Java
微服务(七)-服务网关zuul(三)
微服务(七)-服务网关zuul(三)
|
2月前
|
负载均衡 前端开发 安全
微服务(六)-服务网关zuul(二)
微服务(六)-服务网关zuul(二)
|
3月前
|
Java API 微服务
服务网关Gateway
该博客文章详细介绍了Spring Cloud Gateway的使用方法和概念。文章首先阐述了API网关在微服务架构中的重要性,解释了客户端直接与微服务通信可能带来的问题。接着,文章通过具体的示例代码,展示了如何在Spring Cloud Gateway中添加依赖、编写路由规则,并对路由规则中的基本概念如Route、Predicate和Filter进行了详细解释。最后,文章还提供了路由规则的测试方法。
服务网关Gateway