Java Chassis3过载状态下的快速失败解决分析

 更新时间:2024年01月17日 09:27:47   作者:liubao68  
本文解密了Java Chassis 3快速失败相关的机制和背后故事,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

Java Chassis 3技术解密:过载状态下的快速失败

在 熔断机制的改进路程 技术解密中,总结了如何设计一个优雅的熔断机制。 作为微服务最重要的治理策略之一,熔断机制能够在故障场景起到防止雪崩效应的作用。过载状态是一种特殊的故障场景,主要指超出了系统处理能力的请求量。 在过载状态,熔断机制可能无法起到预期的效果。 为了对过载状态下的防护有个比较直观的认识, 我们先讨论几个典型场景:

  • 假设系统启用了熔断机制,并且设置了隔离仓来检测过载情况。 当系统流量过载的时候,隔离仓触发过载保护,熔断机制会短暂隔离对于实例的访问,并将流量转移到其他实例。 由于总的处理实例数减少,系统实际能够处理的负荷在熔断机制生效的场景下,会进一步降低。 这意味着,相较于没有熔断机制,过载场景熔断机制反而更容易触发雪崩效应。
  • 实际业务场景中,一些接口比较耗时,其他接口都很快的情况非常常见。 如果对耗时接口开启隔离仓进行过载防护,会增加耗时接口的失败率;如果不开启过载防护,耗时接口的并发增加,直观的表现是用户响应时间的增加。在一些业务系统看来,用户体验的下降的影响远小于故障率增加的影响。 微服务治理策略对于这类系统,也可能带来适得其反的效果。

在过载场景,不能进入熔断状态,这需要额外的保护机制来防止过载。 快速失败机制是防止过载的最常用手段,虽然存在性能要求不高的业务场景,快速失败会导致错误率提升这种看似矛盾的情况,但是没有让快速失败机制关上大门,恰当的快速失败并搭配业务上的重试的处理还可以明显改善用户体验。 快速失败机制的要求很简单,就是尽早的拒绝过载流量,尽可能减少过载流量占用的CPU和其他资源时间。

限流

限流是最常用的快速失败措施。 但有个细节经常会被忽略:流量经常是不均衡的,瞬时流量超过阈值,不代表这些流量就应该被拒绝掉。 一个良好的限流措施,需要对流量进行适当的梳理,以减少不必要的限流。 比如下图,限流的核心作用是将每个时间片内,不均匀的流量,变成均匀的流量。

限流发生的时机越早越好。通常会在 edge service 应用限流策略。

## 服务治理配置
servicecomb:
  matchGroup:
    allOperation: |
      matches:
        - apiPath: 
            prefix: "/"
  rateLimiting:
  ## 限流器每1毫秒允许通过10个请求,如果一个请求超过1000毫秒没有获取到
  ## 许可,将被拒绝
    allOperation: |
      rate: 10
      limitRefreshPeriod: 1
      timeoutDuration: 1000

上述限流策略限制了单位时间内进入 edge service 的请求数量,并能对请求进行梳理。限制数量可能在应用程序生命周期过程中难于规划,需要通过系统性的性能测试来评估限制大小。 一个比较好的策略是通过并发数来限制流量。在 edge service, 可以限制发往某个下游的实例当前正在处理的请求数。

## 服务治理配置
servicecomb:
  matchGroup:
    allOperation: |
      matches:
        - apiPath: 
            prefix: "/"
  instanceBulkhead:
    ## 隔离仓限制正在处理的请求数为20个,新来的请求等待1000毫秒没有获取到许可,将被拒绝。
    allOperation: |
      maxConcurrentCalls: 100
      maxWaitDuration: 1000

相比较于单位时间内请求数, 当前正在处理的请求数能够很好的反馈当前的系统繁忙程度,因为一个请求的时延增加,会导致当前正在处理的请求数增加。对于CPU密集型任务, 可以设置稍微小一点的值;对于IO密集型任务,可以设置稍微大一点的值。

线程池队列

在线程池入队和出队的时候,进行快速失败,也是非常常用而且比较有效的手段。 但是这类机制不适用于edge service纯异步工作模式场景, 更加适合于微服务的同步工作模式。

servicecomb:
  executor:
    default:
      maxQueueSize-per-group: 1000

上述配置限制了线程池的队列大小, 少量的过载请求会被排队,队列超限后就会快速拒绝并失败。

servicecomb:
  rest:
    server:
      requestWaitInPoolTimeout: 1000

Java Chassis在出队的时候,也会检测任务等待的时间。 如果等待时间过长, 也会立即拒绝改任务,避免额外的处理资源浪费。

全局的超时检测

一般的RPC系统会针对请求发送到响应接收设置请求超时时间。 微服务系统结构通常的调用关系比较复杂。 比如一个请求链路可能涉及 a -> b -> c -> d。 如果我们的设计目标是请求处理时间小于30s, 如果在 b 接收到 a 的请求的时候, 发现已经处理了 30s, b完全可以不需要请求c来处理这个请求, 快速失败。 Java Chassis 能够在任务处理的关键阶段,进行全局的已经处理的时间检查。

全局的超时检测可以处理对快速失败有非常特殊要求的业务场景,考虑到多数情况下都会很少使用,这里不在详细描述其技术细节, 感兴趣的开发者可以参考Java Chassis的开发指导。

客户故事:系统毛刺(指系统中极低概率的请求缓慢或者处理超时)是困扰觉大多数应用的老大难问题。 因为导致系统毛刺的因素非常多,包括请求的分布不均衡、CPU调度的不可预期、垃圾回收等等。 系统毛刺给客户的用户体验评价带来很多负面的影响,整体请求成功率偏低,平均响应时延偏高。 为了改善毛刺,早期的主要机制是设置请求超时时间,包括设置某个具体微服务的请求超时时间,或者根据调用的顺序,配置逐级递减的超时时间。 超时时间的配置确实起到了快速失败的目的,然而在HTTP场景下,超时会导致关闭连接并重新建连,在大并发场景,会引入更长时间的毛刺和请求超时。 引入流量梳理和隔离仓机制后,系统毛刺问题和超时导致的连接重连问题得到了极大的改善。

以上就是Java Chassis3过载状态下的快速失败解决分析的详细内容,更多关于Java Chassis3过载状态失败解决的资料请关注脚本之家其它相关文章!

相关文章

  • Java中文乱码解决方案全解析,让你的程序“说人话”!

    Java中文乱码解决方案全解析,让你的程序“说人话”!

    探索Java中文乱码解决方案全解析,让你的程序终于能“说人话”!厌倦了看着一串串的问号或者奇怪符号吗?跟着我们的指南,一步步轻松解锁中文乱码的秘密,让你的代码清晰表达每一个字,需要的朋友可以参考下
    2024-02-02
  • Java中的自旋锁spinlock详解

    Java中的自旋锁spinlock详解

    这篇文章主要介绍了Java中的自旋锁spinlock详解,自旋锁就是循环尝试获取锁,不会放弃CPU时间片,减伤cup上下文切换,缺点是循环会消耗cpu,需要的朋友可以参考下
    2024-01-01
  • Java接口请求重试机制的几种常见方法

    Java接口请求重试机制的几种常见方法

    Java接口请求重试机制是保证系统稳定性和容错能力的重要手段之一,当接口请求发生失败或暂时性错误时,通过重试机制可以提高请求的成功率,本文将详细介绍Java接口请求重试机制的几种常见方法,需要的朋友可以参考下
    2023-11-11
  • SpringBoot集成阿里云OSS图片上传

    SpringBoot集成阿里云OSS图片上传

    这篇文章主要为大家详细介绍了SpringBoot集成阿里云OSS图片上传,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • MyBatis 在使用上的注意事项及其辨析(最新最全整理)

    MyBatis 在使用上的注意事项及其辨析(最新最全整理)

    这篇文章主要介绍了MyBatis的在使用上的注意事项及其辨析,本文内容比较长,是小编用心给大家整理的,图文实例代码相结合给大家讲解的非常详细,需要的朋友参考下吧
    2024-06-06
  • SpringBoot实现jsonp跨域通信的方法示例

    SpringBoot实现jsonp跨域通信的方法示例

    这篇文章主要介绍了SpringBoot实现jsonp跨域通信的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • Java整型数与网络字节序byte[]数组转换关系详解

    Java整型数与网络字节序byte[]数组转换关系详解

    这篇文章主要介绍了Java整型数与网络字节序byte[]数组转换关系,结合实例形式归纳整理了java整型数和网络字节序的byte[]之间转换的各种情况,需要的朋友可以参考下
    2017-08-08
  • Java 中的 Unsafe 魔法类的作用大全

    Java 中的 Unsafe 魔法类的作用大全

    Unsafe是位于sun.misc包下的一个类,主要提供一些用于执行低级别、不安全操作的方法,关于Java 中的 Unsafe 魔法类,到底有啥用处,你都了解吗,下面通过本文给大家普及一下
    2021-06-06
  • 深入解析Java中的内部类

    深入解析Java中的内部类

    这篇文章主要介绍了Java中的内部类,是Java入门学习中的基础知识,需要的朋友可以参考下
    2015-07-07
  • spring boot 枚举使用的坑整理

    spring boot 枚举使用的坑整理

    在本篇文章里我们给大家整理了关于spring boot 枚举使用的坑以及相关知识点内容,需要的朋友们学习下。
    2019-08-08

最新评论