【架构】应用保护
这篇文章总结一下应用保护的手段。如今说到应用保护,更多的会想到阿里的sentinel,手段丰富,应用简单。sentinel的限流、降级、熔断,可以自己去试一下,sentinel主要通过配置实现功能,不难。sentinel的简介放在最后。
但其实还是有一些别的方式进行应用保护的,这里简单总结下。
应用保护的原因,是系统压力太大,负载过高,导致数据库慢查询,应用保护的核心思想是,优先保证核心业务,优先保证大部分用户。
一,降级
所谓降级
,就是由于负载过高,给调用者一个降级的响应。主要思想就是减少不必要的操作,保证核心业务可用。
降级逻辑:
1,系统提供后门接口。
2,独立降级系统。
自动开关降级:
需要提前写好前面的降级逻辑。
1,超时请求超过阈值
2,异常请求超过阈值
3,流量超过阈值
触发自动降级开关后,执行降级逻辑。具体来说,可以有下面几种例子。
举例,停止读数据库,准确结果转为近似结果,返回静态结果(猜你喜欢由用户个性化推荐改为统一推荐);同步转异步(写多读少);功能裁剪(推荐干掉);禁止写(高峰期减少不必要的写);分用户降级;工作量证明 POW(验证码,数学题,拼图题等,滑块)。
二,熔断
与降级
是自身服务出现问题返回降级结果不同,熔断
是两个服务之间的调用出现问题导致的。
当下游服务出现问题时(慢响应甚至超时/异常),有可能拖慢自身服务的响应速度,或者自身服务的异常,也就是导致所谓的服务雪崩
。因此需要对下游服务进行熔断打开熔断开关,期间不会访问下游服务,谓之“服务隔离
”。过一段时间开关进入半开状态,放少量请求给下游服务,如果不满足熔断条件,就关闭熔断开关,如果依然满足熔断条件,就继续熔断,这就是所谓的快速失败
。如此半开-快速失败,循环直到下游服务恢复为止。
三,限流
顾名思义,是请求太多限制请求数。限流分为两种,基于时间的限流和基于资源的限流。
1,基于时间的限流
(1),基于请求总数的限制,如直播间超过100人,就不让进了。
(2),基于单位时间内请求数的限制。
基于时间的限流的实现,可以使用固定时间窗口、滑动时间窗口、漏桶算法、令牌桶算法。
其中,
固定时间窗口的请求突刺问题最大;
滑动时间窗口相比固定时间窗口,请求突刺问题要小一些,但是仍然存在;
漏桶算法是固定时间内放进来的请求个数存在上限。这种算法不存在请求突刺问题,但是需要配合队列存放请求,存放的请求个数超出队列长度,会出现服务器拒绝响应的问题。
令牌桶算法是令牌桶固定时间内会发放指定个数的令牌,放进来请求需要消耗令牌,如果令牌消耗完了就无法访问服务器,需要等待令牌桶发放新的令牌。这种算法可以让请求突刺变得平滑一些,但是仍然需要系统容忍一定程度的请求突刺。
限流阈值的确定可以提前进行压测,但是压测不一定能完全反应线上的环境,可能需要先定一个阈值,然后长期观察和调优。降级/熔断/限流的开关阈值都是这样的。
基于时间的限流的调优思路,包括各级缓存,MQ的解耦,通过长连接给用户响应等。
2,基于资源的限流
对资源的限制,如连接池、线程池,以及队列等。
(1),池化技术:连接数,线程池。
(2),队列大小:请求队列。10个。
这种限流的难点是确定资源的大小。如确定线程池中线程数,可以先通过公式计算出理论线程数的大小,然后通过压测+hippo4j
[3]工具,可视化的观察基于理论线程数调优的表现,确定线程数。
因为线上的环境比较复杂,IO密集型、CPU密集型甚至混合型,书中的公式不一定完全适合线上环境,因此需要进行压测,结合可视化工具进行观察,以及线上的观察和调优。
下面是用于线程数计算的公式,与计算使用线程并行后得到的加速比的阿姆达尔定理,
公式1,《Java并发编程实战》
为保持处理器达到期望的使用率,最优的池的大小等于:
Nthreads = Ncpu x Ucpu x (1 + W/C)[1]
其中,
Ncpu = CPU的数量
Ucpu = 目标CPU的使用率, 0 <= Ucpu <= 1
W/C = 等待时间与计算时间的比率
公式2,《Java 虚拟机并发编程》
线程数 = Ncpu /(1 - 阻塞系数)[1]
公式1与公式2计算得出,
阻塞系数 = W / (W + C),
即阻塞系数 = 阻塞时间 /(阻塞时间 + 计算时间)
定理1,阿姆达尔定理
Amdahl定律,定律定义了串行系统并行化后的加速比计算公式[1],
加速比 = 优化前系统耗时 / 优化后系统耗时
加速比越大,表明系统并行化的优化效果越好。Addahl定律还给出了系统并行度、CPU数目和加速比的关系,加速比为Speedup,系统串行化比率(指串行执行代码所占比率)为F,CPU数目为N:
Speedup <= 1 / (F + (1-F)/N)
四,隔离
隔离不是只有在熔断时对下游服务器进行隔离,广义上的隔离方式如下:
1,数据隔离:数据重要性排序,也就要垂直分库、垂直分表。
2,机器隔离:给重要的用户单独配置服务器。用户的标识去路由。
3,线程池隔离:每个需要线程池的业务单独分配线程池。hystrix。
4,信号量隔离:给某个业务或请求单独分配一个计数器。hystrix。
5,集群隔离:对服务进行分组(在注册中心做这个事),如秒杀服务,单独分出一组服务给核心业务
6,机房隔离:不同的服务不要放在同一个机房。
7,读写隔离:搭建数据库的主从与读写分离,用户的create update delete \ select 请求也要进行相应的分离。
8,动静隔离:识别动静态数据,进行分流与隔离。nginx,apache。
9,爬虫隔离:使用openrestry的user-agent, 对超出访问阈值的ip进行隔离
五,sentinel
在应用中引入sentinel的依赖,在接口上标注@SentinelResource
注解,表示这个接口是一个sentinel资源,这样在搭建好的sentinel-dashboard
中可以看到这个资源。
SentinelResource注解中,比较重要的几个属性,value
为资源名称,fallback
是降级
的兜底方法,blockHandler
是限流
的兜底方法[2]。
下面是dashboard截图。
sentinel流控规则
sentinel熔断规则
sentinel热点规则
sentinel授权规则
参考文章:
[1],Java并发(八)计算线程池最佳线程数
[2],微服务系列:Sentinel 之 @SentinelResource 注解配置
[3],一个基于Java线程池管理的开源框架Hippo4j实践
相关文章:

【架构】应用保护
这篇文章总结一下应用保护的手段。如今说到应用保护,更多的会想到阿里的sentinel,手段丰富,应用简单。sentinel的限流、降级、熔断,可以自己去试一下,sentinel主要通过配置实现功能,不难。sentinel的简介放…...

从核心到边界:六边形、洋葱与COLA架构的深度解析
文章目录 1 引言2 软件架构3 架构分类4 典型的应用架构4.1 分层架构4.2 CQRS4.3 六边形架构4.4 洋葱架构4.5 DDD 5 COLA架构设计5.1 分层设计5.2 扩展设计5.3 规范设计5.3.1 组件规范5.3.2 包规范5.3.3 命名规范 6 COLA架构总览7 小结 1 引言 软件的首要技术使命:管…...

04-Fastjson反序列化漏洞
免责声明 本文仅限于学习讨论与技术知识的分享,不得违反当地国家的法律法规。对于传播、利用文章中提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,本文作者不为此承担任何责任,一旦造成后果请自行承担&…...
ABC365(A-D)未补
A - Leap Year(模拟) 题意:给定一个数字n,如果n不是4的倍数,输出365;如果n是4的倍数但不是100的倍数,输出366;如果n是100的倍数但不是400的倍数,输出365;如果…...
Python用png生成不同尺寸的图标
Kimi生成 from PIL import Imagedef generate_icon(source_image_path, output_image_path, size):with Image.open(source_image_path) as img:# 转换图片为RGBA模式,确保有透明通道if img.mode ! RGBA:img img.convert(RGBA)# 调整图片大小到指定尺寸img img.r…...

1688中国站获得工厂档案信息 API
公共参数 名称类型必须描述keyString是免费申请调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,item_get,item_search_shop等]cacheString否[yes,no]默认y…...

定时任务框架 xxl-job
🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…...

C/C++关键字大全
目录 一、const 二、static 三、#define 和 typedef 四、#define 和 inline 五、#define 和 const 六、new 和 malloc 七、const 和 constexpr 八、volatile 九、extern 十、前置 和后置 十一、atomic 十二、struct 和 class 一、const 1、const 关键字可用于定义…...

ROS2 Linux Mint 22 安装教程
前言: 本教程在Linux系统上使用。 一、linux安装 移动硬盘安装linux:[LinuxToGo教程]把ubuntu装进移动固态,随时随用以下是我建议安装linux mint版本的清单: 图吧工具箱:https://www.tbtool.cn/linux mint: https://…...

快速将网站从HTTP升级为HTTPS
在当今数字化的世界中,网络安全变的越来越重要,HTTPS(超文本传输安全协议)不仅能够提供加密的数据传输,还能增强用户信任度,提升搜索引擎排名,为网站带来多重益处。所以将网站从HTTP升级到HTTPS…...

Qt程序移植至Arm开发板
目录 1.工具准备: 系统调试工具SecureCRT 虚拟机安装linux(Ubuntu) 交叉编译工具链 ARM 端Qt 环境(Qt-5.7.1) 1) linux processor SD安装 2)交叉编译工具链配置 2.编译Qt工程: 2.0 交叉编译 依赖库源码,生成动…...

删除分区 全局索引 drop partition global index Statistics变化
1.不一定unusable,可以先删除data (index 再删除过程中会更新结构)再drop/truncate. ---------------------- CREATE TABLE interval_sale ( prod_id NUMBER(6) , cust_id NUMBER , time_id DATE ) PARTITION BY RANGE (time_i…...

git回退未commit、回退已commit、回退已push、合并某一次commit到另一个分支
文章目录 1、git回退未commit2、git回退已commit3、git回退已push的代码3.1 直接丢弃某一次的push3.2 撤销push后,不丢弃改动,重新修改后要再次push 4、合并某一次commit到另一个分支 整理几个工作上遇到的git问题。 1、git回退未commit git回退未comm…...

yolov8pose 部署rknn(rk3588)、部署地平线Horizon、部署TensorRT,部署工程难度小、模型推理速度快,DFL放后处理中
特别说明:参考官方开源的yolov8代码、瑞芯微官方文档、地平线的官方文档,如有侵权告知删,谢谢。 模型和完整仿真测试代码,放在github上参考链接 模型和代码。 之前写了yolov8、yolov8seg、yolov8obb 的 DFL 放在模型中和放在后处理…...
程序员找工作之操作系统面试题总结分析
程序员在找工作面试时,操作系统方面可能会被问到的问题涵盖了多个核心知识点和概念。以下是对这些面试问题的总结和分析: 1. 核心硬件与体系结构 微机的核心部件:询问微机硬件系统中最核心的部件是什么(CPU)。处理机…...
TypeScript 迭代器和生成器详解
目录 迭代器(Iterators) 生成器(Generators) 使用场景 for..of vs. for..in 语句 for..of 循环 for..in 循环 区别总结 注意事项 总结 在 TypeScript 中,迭代器(Iterators)和生成器&am…...

echarts 极坐标柱状图 如何定义柱子颜色
目录 echarts 极坐标柱状图 如何定义柱子颜色问题描述方式一 在 series 数组中定义颜色方式二 通过 colorBy 和 color 属性配合使用 echarts 极坐标柱状图 如何定义柱子颜色 本文将分享在使用 echarts 的 极坐标柱状图 时,如何自定义柱子的颜色。问题本身并不难解决…...

JavaScript模块化
JavaScript模块化 一、CommonJS规范1、在node环境下的模块化导入、导出 2、浏览器环境下使用模块化browserify编译js 二、ES6模块化规范1、在浏览器端的定义和使用2、在node环境下简单使用方式一:方式二: 3、导出数据4、导入数据5、数据引用问题 一、Com…...

文件包含漏洞Tomato靶机渗透_详解
一、导入靶机 将下载好的靶机拖入到VMware中,填写靶机机名称(随便起一个)和路径 虚拟机设置里修改网络状态为NAT模式 二、信息收集 1、主机发现 用御剑扫描工具扫描虚拟机的NAT网段,发现靶机的IP是192.168.204.141 2、端口扫描 用御剑端口扫描扫描全…...
湖北汽车工业学院-高等数学考纲
湖北汽车工业学院2024年普通专升本考试的《高等数学》考试大纲已经公布。考试形式为闭卷笔试,满分100分,考试时间为90分钟。考试内容主要包括以下几个部分: 1. **函数、极限、连续**: 涉及函数概念、表示法、有界性、周期性、奇偶…...

XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...

3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...

SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...

Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...

在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...
鸿蒙HarmonyOS 5军旗小游戏实现指南
1. 项目概述 本军旗小游戏基于鸿蒙HarmonyOS 5开发,采用DevEco Studio实现,包含完整的游戏逻辑和UI界面。 2. 项目结构 /src/main/java/com/example/militarychess/├── MainAbilitySlice.java // 主界面├── GameView.java // 游戏核…...