微服务核心理论 - 微服务治理之超时

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO

联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬

学习必须往深处挖,挖的越深,基础越扎实!

阶段1、深入多线程

阶段2、深入多线程设计模式

阶段3、深入juc源码解析


阶段4、深入jdk其余源码解析


阶段5、深入jvm源码解析

码哥源码部分

码哥讲源码-原理源码篇【2024年最新大厂关于线程池使用的场景题】

码哥讲源码【炸雷啦!炸雷啦!黄光头他终于跑路啦!】

码哥讲源码-【jvm课程前置知识及c/c++调试环境搭建】

​​​​​​码哥讲源码-原理源码篇【揭秘join方法的唤醒本质上决定于jvm的底层析构函数】

码哥源码-原理源码篇【Doug Lea为什么要将成员变量赋值给局部变量后再操作?】

码哥讲源码【你水不是你的错,但是你胡说八道就是你不对了!】

码哥讲源码【谁再说Spring不支持多线程事务,你给我抽他!】

终结B站没人能讲清楚红黑树的历史,不服等你来踢馆!

打脸系列【020-3小时讲解MESI协议和volatile之间的关系,那些将x86下的验证结果当作最终结果的水货们请闭嘴】

1 介绍

在复杂的互联网场景中,不可避免的会因为一些内在或者外在的因素,导致出现请求超时的情况。
而典型的业务超时场景主要有如下:

  • 网络延迟或者抖动或者丢包,从而导致响应时间变长。

  • 容器甚至云主机资源瓶颈情况:如CPU使用率过高、内存使用是否正常、磁盘IO压力情况、网络时延情况等资源使用情况异常,也可能导致响应时间变长。

  • 负载均衡性问题:多实例下分配的流量不均衡,目前看云基础场景,这个情况不多见。

  • 突发洪峰请求:大部分对内的业务基本不存在非预期的流量,突发洪峰请求主要还是程序的调用不合理或者程序bug(内存泄露、循环调用、缓存击穿等)。


    单个Pod实例,长耗时容易造成队列堆积,对资源损耗很大,快速的释放或者调度开是一个比较好的办法,是一种普遍可接受的降级方案,否则超时阻塞会导致服务长时间不可用。
    而且这种影响是水平扩散的,同服务上的其他功能也会被争抢资源。

2 超时的常见治理手段

2.1 采用超时重试实现故障恢复

超时重试:对服务的核心接口进行细粒度配置,具体接口超时时间应该 ≥ TP999(即满足999‰的网络请求所需要的最低耗时)的耗时。

执行过程说明

  • 这边以示例服务 Svc-A 向 Svc-B 发起访问为例子。
  • 第1次执行,因为SvcB-Inst1高负载,所以在规定的时间内(比如2s)没有得到响应。
  • 当请求方(Svc A)感知到超时无响应的时候,再次发起请求。
  • 因为负载均衡策略,被请求方发生了变动,说明调度到新的实例(Svc-B-Instance1 到 Svc-B-Instance2)。
  • 第二次请求返回正常的 200 。

2.1 采用超时断连实现系统保护

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

执行过程说明

  • 这边以示例服务 Svc-A 向 Svc-B 发起访问为例子。
  • 第1次执行,因为SvcB-Inst1高负载,所以在规定的时间内(比如2s)没有得到响应。
  • 当请求方(Svc A)感知到超时无响应的时候,直接进行断连,不再发起请求。
  • 如果使用Service Mesh 做微服务治理,则会由SideCar进行断连,并Response给请求方
  • 504 代表 504 Gateway Time-out,flag = UT 代表 Upstream request timeout in addition to 504 response code。

3 策略实现(Service Mesh方案)

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

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

4 总结

云基础场景下的治理手段各种各样,这边讲解了初级版的超时重试和超时熔断方案,让用户有一个更优良的使体验。
同时在系统大面积崩溃的时候,进行系统保护,不至于全面崩塌。
在后续的章节我们逐一了解下故障注入、熔断限流、异常驱逐等高级用法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值