Java 过载状态下的快速失败

news2024/11/15 19:30:23

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场景下,超时会导致关闭连接并重新建连,在大并发场景,会引入更长时间的毛刺和请求超时。 引入流量梳理和隔离仓机制后,系统毛刺问题和超时导致的连接重连问题得到了极大的改善。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

商品详情使用富文本编辑器

1、https://www.wangeditor.com/ 1、安装依赖包 npm install wangeditor/editor-for-vuenext --save 2、因为好多页面都需要用到&#xff0c;封装富文本编辑器组件 Editor.vue代码 <template><div style"border: 1px solid #ccc"><Toolbar style&q…

Syslog 管理工具

Syslog常被称为系统日志或系统记录&#xff0c;是一种用来在互联网协议&#xff08;TCP/IP&#xff09;的网上中传递记录档消息的标准&#xff0c;常用来指涉实际的Syslog 协议&#xff0c;或者那些提交syslog消息的应用程序或数据库。 系统日志协议&#xff08;Syslog&#x…

成为CMake砖家(3):Windows安装make.exe

大家好&#xff0c;我是白鱼。相信很多朋友已经在用 CMake 做交叉编译了&#xff0c; 而交叉编译往往少不了 make.exe, 这篇来讲讲 make.exe 在 Windows 上的安装。 1. 交叉编译需要 generator CMake 本身是一个 meta build tool&#xff0c; 或者说它是派发任务到具体的 bui…

Windows上网络调试助手NetAssist的使用

NetAssist是Windows上的网络调试助手&#xff0c;从 https://free.cmsoft.cn 下载最新的5.0.13版本&#xff0c;解压缩后直接双击NetAssist.exe即可&#xff0c;无需安装&#xff0c;界面如下图所示&#xff1a; (1).支持的协议类型包括&#xff1a;UDP、UDP IPv6、TCP Client、…

操作系统真象还原:创建文件系统

14.2 创建文件系统 14.2.1 创建超级块、i结点、目录项 超级块 /** Author: Adward-DYX 1654783946qq.com* Date: 2024-05-07 10:18:02* LastEditors: Adward-DYX 1654783946qq.com* LastEditTime: 2024-05-07 11:24:50* FilePath: /OS/chapter14/14.2/fs/super_block.h* Des…

P14-磁通量、高斯定理

高斯定理&#xff1a; 由于磁感线是闭合的&#xff0c;因此对于任一闭合曲面来说&#xff0c;有多少条磁感线进入闭合曲面&#xff0c;就一定有多少条磁感线穿出该闭合曲面。也就是说&#xff0c;通过任意闭合曲面的磁通量必等于零&#xff0c;称为磁场的高斯定理或磁通连续定…

前端面试题(CSS篇六)

一、浏览器如何判断是否支持 webp 格式图片 &#xff08;1&#xff09;宽高判断法。通过创建image对象&#xff0c;将其src属性设置为webp格式的图片&#xff0c;然后在onload事件中获取图片的宽高&#xff0c;如果能够获取&#xff0c;则说明浏览器支持webp格式图片。如果不能…

【pbootcms】新环境搭建环境安装时发生错误

【pbootcms】新环境搭建环境安装时发生错误 提示一下内容&#xff1a; 登录请求发生错误&#xff0c;您可按照如下方式排查: 1、试着删除根目录下runtime目录,刷新页面重试 2、检查系统会话文件存储目录是否具有写入权限; 3、检查服务器环境pathinfo及伪静态规则配置; 先按照…

OWASP 移动应用 2024 十大安全风险

1. OWASP 移动应用 2024 十大安全风险 开放全球应用程序安全项目 &#xff08;OWASP&#xff09; 是一个非营利性基金会&#xff0c;致力于提高软件的安全性。自 2014、2016 年两次发布了移动应用的十大风险后&#xff0c;今年再次发布2024版。这对移动应用软件的检查工具有着…

css画半圆画圆弧

利用border-radius和border完成&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>test</title> <style> .semicircle {width: 100px;height: 50px;border-radius: 0 0 50px 50px;background:…

IDEA社区版使用Maven archetype 创建Spring boot 项目

1.新建new project 2.选择Maven Archetype 3.命名name 4.选择存储地址 5.选择jdk版本 6.Archetype使用webapp 7.create创建项目 创建好长这样。 检查一下自己的Maven是否是自己的。 没问题的话就开始增添java包。 [有的人连resources包也没有&#xff0c;那就需要自己添…

5、Hacker_Kid-v1.0.1

中等难度 目标root权限 先进行一波IP地址发现 netdiscover -i eth0 -r 192.168.1.1/24 发现存在的靶机ip 进行一波端口的探测 发现是一个apache的服务和一个tornado的网站 这里有个细节部分&#xff0c;53端口常见的情况都是走的udp协议做的域名解析&#xff0c;这里查询出来…

manim学习笔记04:使用manim,表示向量和加法。

manim学习笔记04&#xff1a;使用manim&#xff0c;表示向量和加法。 一&#xff0c;相关定义 1.有向线段&#xff1a; 规定若线段 AB的端点为起点为A&#xff0c;B为终点&#xff0c;则线段就具有了从起点 A到终点 B的方向和长度。具有方向和长度的线段叫做有向线段。 接下…

多个版本JAVA切换(学习笔记)

多个版本JAVA切换 很多时候&#xff0c;我们电脑上会安装多个版本的java版本&#xff0c;java8&#xff0c;java11&#xff0c;java17等等&#xff0c;这时候如果想要切换java的版本&#xff0c;可以按照以下方式进行 1.检查当前版本的JAVA 同时按下 win r 可以调出运行工具…

牛客周赛51

思路&#xff1a;求a mod 上b后的值为amodb, 求gcd(b, amodb)即可 int gcd(int a,int b){return b ? gcd(b, a % b) : a; }void solve(){string a;cin >> a;int b;cin >> b;int amodb 0;for(auto c : a){amodb (amodb * 10 (c - 0)) % b;}cout << gcd(b…

Access denied for user ‘root‘@‘localhost‘ (using password: YES)解决办法

在Spring配置数据源时&#xff0c;当使用Spring容器加载druid.properties数据库连接池配置文件时&#xff0c;容易碰到create connection SQLException, url: jdbc:mysql://127.0.0.1:3306/mydbs, errorCode 1045, state 28000 java.sql.SQLException: Access denied for user …

【 香橙派 AIpro评测】烧系统运行部署LLMS大模型体验Jupyter Lab AI 应用样例(新手入门)

文章目录 一、引言⭐1.1下载镜像烧系统⭐1.2开发板初始化系统配置远程登陆&#x1f496; 远程ssh&#x1f496;查看ubuntu桌面&#x1f496; 远程向日葵 二、部署LLMS大模型2.1 快速启动&#x1f496;拉取代码&#x1f496;下载mode数据&#x1f496;启动模型对话 三、体验 内置…

JavaScript 如何中止Promise

目录 方法 1&#xff1a;使用新的 Promise.withResolvers() 方法 2&#xff1a;使用 AbortController 在 JavaScript 中&#xff0c;你可能已经知道如何取消请求&#xff1a;对于 XHR 可以使用 xhr.abort() &#xff0c;对于 fetch 可以使用 signal 。但是你如何取消一个普通…

网络技术相关知识概念

网络技术&#xff1a; 进程&#xff08;Process&#xff09; 定义&#xff1a;进程是程序的一次执行过程&#xff0c;它有自己的内存空间和系统资源&#xff08;资源独立&#xff09;。特性&#xff1a; 每个进程都有唯一的PID&#xff08;进程ID&#xff09;。进程间通信&am…

6、evil box one

低—>中 目标&#xff1a;获取root权限以及2个flag 主机发现 靶机 192.168.1100.40 或者使用fping -gaq 192.168.100.1/24发现主机使用ping的方式。 端口扫描 发现开放了22和80 可以使用-A参数&#xff0c;-A参数会得到更多的扫描细节 访问80端口就是一个apache的基本的…