ServiceMesh 5:异常重试和超时保护提升服务可用性

news/2024/12/12 10:03:35/文章来源:https://www.cnblogs.com/wzh2010/p/18031109

★ ServiceMesh系列

1 背景

在复杂的互联网场景中,不可避免的会出现请求失败或者超时的情况。
从程序的的响应结果来看,一般是Response返回5xx状态的错误;从用户的角度去看,一般是请求结果不符合预期,即操作失败(如转账失败、下单失败、信息获取不到等)。
偶发的不可避免的5xx请求错误,产生的原因有很多种,比如:

  • 网络延迟或者抖动
  • 服务器资源不足(CPU、内存走高、连接池满)
  • 服务器故障
  • 符合某些特定条件下的服务程序bug(大都非必现)
    image

2 系统稳定性等级划分

大部分服务容忍低频、偶发的5xx错误,并使用可用性级别来衡量系统的健壮性,级别系数越高,健壮性越好,如下:

等级描述 故障时长(年) 可用行等级
基本可用性 87.6h 99%
较高可用 8.8h 99.9%
非常高的可用性(大部分故障可自动恢复) 52m 99.99%
极高可用性 5m 99.999%

对于强系统可靠性、强结果预期性 要求的系统,如转账、下单、付款,即使微小的可用性降级也是不可接受,用户强烈需要接收到正确的结果。
可以想想你付款的时候发现付款失败有多么惊慌,订外卖的时候获取信息失败有多么沮丧,这些都是用户痛点。

3 请求异常的治理手段

3.1 采用异常重试实现故障恢复

通过上面的故障原因分析我们知道,排除了必现的程序逻辑错误,大部分环境导致的错误是可以通过重试进行恢复的。
治理的手段主要是采用 异常重试 来实现的,通过重试负载到健康实例上(实例越多重试成功率越高),降低用户感知到的故障频率。
image

执行过程说明

  • 这边以示例服务 Svc-A 向 Svc-B 发起访问为例子。
  • 第1次执行失败之后,根据策略,间隔25ms之后发起第2次请求。
  • 会看到有两条日志,日志的trace_id 一致,说明他是同一个调用过程(1个调用过程,包含2次请求,首发1次与重试1次)
  • 请求方为同一个实例 Svc-A-Instance1,说明请求发起方一致。
  • 被请求方发生了变动,说明调度到新的实例(Svc-B-Instance1 到 Svc-B-Instance2)。
  • 返回正常的 200 。

因为我们的负载均衡模式默认是RR,所以实例越多,实际上重试成功的概率会越高。比如有50个实例,其中一个实例出故障,导致执行返回5xx,那么第二次请求的时候一般来说会有 49/50 的成功概率。如下图:
image

3.2 Istio策略实现

注释比较清晰了,这边就不解释了。

# VirtualService
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:name: xx-svc-b-vsnamespace: kube-ns-xx
spec:hosts:- svc_b.google.com # 治理发往 svc-b 服务的流量http:- match:  # 匹配条件的流量进行治理- uri:prefix: /v1.0/userinfo   # 匹配路由前缀为 /v1.0/userinfo 的,比如 /v1.0/userinfo/1305015retries:attempts: 1  # 重试一次perTryTimeout: 1s  # 首次调用和每次重试的超时时间retryOn: 5xx  # 重试触发的条件timeout: 2.5s  #  请求整体超时时间为2.5s,无论重试多少次,超过该时间就断开。route:- destination:host: svc_b.google.comweight: 100- route:  # 其他未匹配的流量默认不治理,直接流转- destination:host: svc_c.google.comweight: 100

4 请求超时的治理手段

4.1 请求超时的主要原因

  • 网络延迟或者抖动或者丢包,从而导致响应时间变长。
  • 容器甚至云主机资源瓶颈情况:如CPU使用率过高、内存使用是否正常、磁盘IO压力情况、网络时延情况等资源使用情况异常,也可能导致响应时间变长。
  • 负载均衡性问题:多实例下分配的流量不均衡,目前看云基础场景,这个情况不多见。
  • 突发洪峰请求:如流不存在非预期的流量,作为主打对内的项目,突发洪峰请求主要还是程序的调用不合理或者程序bug(内存泄露、循环调用、缓存击穿等)。
    image
    单个副本,长耗时容易造成队列堆积,对资源损耗很大,快速的释放或者调度开是一个比较好的办法,是一种普遍可接受的降级方案,否则超时阻塞会导致服务长时间不可用。
    而且这种影响是水平扩散的,同服务上的其他功能也会被争抢资源。

4.2 Istio的治理手段

4.2.1 超时重试

对服务的核心接口进行细粒度配置,具体接口超时时间应该在 ≥ TP 99.9(满足999‰的网络请求所需要的最低耗时)的耗时,可以考虑重试。
image

4.2.2 超时熔断

通过指定超时时间对请求进行断连,达到降级的目的。避免长时间队列阻塞,导致雪崩沿调用向上传递,造成整个链路崩溃。
image

4.3 Istio策略实现

关注下方代码中的两个星号 ★ 的属性:

  • perTryTimeout 指的是首次调用和每次重试的超时时间,超过这个时间,说明请求大概率已经pending住了,则进行重试,争取落到其他健康实例上,更快拿回的结果。
  • timeout 指的是请求整体超时时间为2.5s,无论重试多少次,超过该时间就断开,这是一种保护策略,避免过度重试或者长时间Pending导致服务恶化甚至雪崩。
# VirtualService
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:name: xx-svc-b-vsnamespace: kube-ns-xx
spec:hosts:- svc_b.google.com # 治理发往 svc-b 服务的流量http:- match:  # 匹配条件的流量进行治理- uri:prefix: /v1.0/userinfo   # 匹配路由前缀为 /v1.0/userinfo 的,比如 /v1.0/userinfo/1305015retries:attempts: 1  # 重试一次perTryTimeout: 1s  #  ★ 首次调用和每次重试的超时时间retryOn: 5xx  # 重试触发的条件timeout: 2.5s  #  ★ 请求整体超时时间为2.5s,无论重试多少次,超过该时间就断开。route:- destination:host: svc_b.google.comweight: 100- route:  # 其他未匹配的流量默认不治理,直接流转- destination:host: svc_c.google.comweight: 100

5 总结

本文我们介绍了使用服务网格进行异常重试和超时熔断的治理。Istio提供了丰富的治理能力,后续的章节我们逐一了解下故障注入、熔断限流、异常驱逐等高级用法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/851249.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

免费领900元鸿蒙先锋权益,抢先体验原生应用焕然一新

华为Mate品牌盛典上正式发布了华为Mate 70系列,用户新机到手即可升级HarmonyOS NEXT并免费领取价值高达900元“鸿蒙有礼”先锋权益,体验焕然一新的鸿蒙原生应用。近日,在华为发布的鸿蒙原生应用创意视频中,生动展现了原生应用的高品质内容体验。此外,原生应用还带来全场景…

转载:【AI系统】模型剪枝

本文将介绍模型剪枝的概念、方法和流程,这是一种通过移除神经网络中的冗余或不重要参数来减小模型规模和提高效率的模型压缩技术。 剪枝不仅可以减少模型的存储和计算需求,还能在保持模型性能的同时提高模型的泛化能力。我们将探讨剪枝的定义、分类、不同阶段的剪枝流程,以及…

转载:【AI系统】训练后量化与部署

本文将会重点介绍训练后量化技术的两种方式:动态和静态方法,将模型权重和激活从浮点数转换为整数,以减少模型大小和加速推理。并以 KL 散度作为例子讲解校准方法和量化粒度控制来平衡模型精度和性能。 训练后量化的方式 训练后量化的方式主要分为动态和静态两种。 动态离线量…

转载:【AI系统】EfficientNet 系列

本文主要介绍 EfficientNet 系列,在之前的文章中,一般都是单独增加图像分辨率或增加网络深度或单独增加网络的宽度,来提高网络的准确率。而在 EfficientNet 系列论文中,会介绍使用网络搜索技术(NAS)去同时探索网络的宽度(width),深度(depth),分辨率(resolution)对模型准确…

转载:【AI系统】轻量级CNN模型新进展

在本文会接着介绍 CNN 模型的小型化,除了第二篇文章提到的三个模型外,在本文会继续介绍 ESPNet 系列,FBNet 系列,EfficientNet 系列和 GhostNet 系列。 ESPNet 系列 ESPNetV1 ESPNet V1:应用在高分辨图像下的语义分割,在计算、内存占用、功耗方面都非常高效。主要贡献在于…

人工智能大语言模型起源篇(一),从哪里开始

序言:许多人最初接触人工智能都是在ChatGPT火热之际,并且大多停留在应用层面。对于希望了解其技术根源的人来说,往往难以找到方向。因此,我们编写了《人工智能大语言模型起源篇》,旨在帮助读者找到正确的学习路径,了解大型语言模型的大致起源。本文将分为三个部分,介绍当…

火焰监测识别摄像机

火焰识别摄像机是一种可以监测环境中火焰的摄像设备,具有广泛的应用场景,包括但不限于工业厂区、商业建筑、森林防火等领域。这种摄像机可以通过对火焰的热辐射进行识别和分析,及时发现火源并采取相应措施,可以有效减少火灾带来的损失,提高安全性和管理效率。火焰识别摄像…

【最优化方法】第六次要点整理

目录拟牛顿法的思想拟牛顿法的条件拟牛顿法的步骤校正矩阵的确定SR1 校正(对称秩 1 校正)DFP 校正BFGS 算法 拟牛顿法的思想 牛顿法的迭代方程为: \[d_k = - (\nabla^2 f(x_k))^{-1} \nabla f(x_k) \]牛顿法的优缺点:优点:局部二阶收敛,速度快。 缺点:每步都要计算 Hess…

抽烟监测识别摄像机

抽烟识别摄像机是一种利用计算机视觉和人工智能技术的设备,能够实时监测和识别吸烟行为。该摄像机通过分析人体姿态和动作,识别出可能的吸烟行为,并及时发出警告或报警。这种摄像机可以广泛应用于公共场所、办公场所、学校和医疗机构等地方,帮助管理者有效监控吸烟行为,及…

OpenAPI 与 国产 Solon 框架支持,Fast Request 2024.1.9 发布

Fast Request是一个类似于 Postman 的 IDEA 插件。它是一个强大的 restful api 工具包插件,可以根据已有的方法帮助您快速、自动生成 url 和 params。 Restful Fast Request = API 调试工具 + API 管理工具 + API 搜索工具。 它有一个漂亮的界面来完成请求、检查服务器响应、存…

EtherNet/IP 转 Modbus 网关作用下 AB PLC 控制变频器的案例呈现

在工业自动化控制系统中,常常会遇到不同品牌和通信协议的设备需要协同工作的情况。本案例中,客户现场采用了 AB PLC,但需要控制的变频器仅支持 Modbus 协议。为了实现 AB PLC 对变频器的有效控制与监控,引入了捷米特 JM-EIP-RTU 网关来完成 EtherNet/IP 与 Modbus 之间的协…

Qt编写RK3588视频播放器/支持RKMPP硬解/支持各种视音频文件和视频流/海康大华视频监控

一、前言 用ffmpeg做硬解码开发,参考自带的示例hw_decode.c即可,里面提供了通用的dxva2/d3d11va/vaapi这种系统层面封装的硬解码,也就是无需区分用的何种显卡,操作系统自动调度,基本上满足了各种场景的需要,这种方式很通用也便捷,但是一些特殊场景必须要用指定硬解码器名…