当前位置: 首页 > news >正文

【架构】应用保护

这篇文章总结一下应用保护的手段。如今说到应用保护,更多的会想到阿里的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实践

相关文章:

【架构】应用保护

这篇文章总结一下应用保护的手段。如今说到应用保护&#xff0c;更多的会想到阿里的sentinel&#xff0c;手段丰富&#xff0c;应用简单。sentinel的限流、降级、熔断&#xff0c;可以自己去试一下&#xff0c;sentinel主要通过配置实现功能&#xff0c;不难。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 引言 软件的首要技术使命&#xff1a;管…...

04-Fastjson反序列化漏洞

免责声明 本文仅限于学习讨论与技术知识的分享&#xff0c;不得违反当地国家的法律法规。对于传播、利用文章中提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;本文作者不为此承担任何责任&#xff0c;一旦造成后果请自行承担&…...

ABC365(A-D)未补

A - Leap Year&#xff08;模拟&#xff09; 题意&#xff1a;给定一个数字n&#xff0c;如果n不是4的倍数&#xff0c;输出365&#xff1b;如果n是4的倍数但不是100的倍数&#xff0c;输出366&#xff1b;如果n是100的倍数但不是400的倍数&#xff0c;输出365&#xff1b;如果…...

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模式&#xff0c;确保有透明通道if img.mode ! RGBA:img img.convert(RGBA)# 调整图片大小到指定尺寸img img.r…...

1688中国站获得工厂档案信息 API

公共参数 名称类型必须描述keyString是免费申请调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_get,item_search_shop等]cacheString否[yes,no]默认y…...

定时任务框架 xxl-job

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…...

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 安装教程

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

快速将网站从HTTP升级为HTTPS

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

Qt程序移植至Arm开发板

目录 1.工具准备&#xff1a; 系统调试工具SecureCRT 虚拟机安装linux&#xff08;Ubuntu) 交叉编译工具链 ARM 端Qt 环境(Qt-5.7.1) 1) linux processor SD安装 2&#xff09;交叉编译工具链配置 2.编译Qt工程&#xff1a; 2.0 交叉编译 依赖库源码&#xff0c;生成动…...

删除分区 全局索引 drop partition global index Statistics变化

1.不一定unusable&#xff0c;可以先删除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后&#xff0c;不丢弃改动&#xff0c;重新修改后要再次push 4、合并某一次commit到另一个分支 整理几个工作上遇到的git问题。 1、git回退未commit git回退未comm…...

yolov8pose 部署rknn(rk3588)、部署地平线Horizon、部署TensorRT,部署工程难度小、模型推理速度快,DFL放后处理中

特别说明&#xff1a;参考官方开源的yolov8代码、瑞芯微官方文档、地平线的官方文档&#xff0c;如有侵权告知删&#xff0c;谢谢。 模型和完整仿真测试代码&#xff0c;放在github上参考链接 模型和代码。 之前写了yolov8、yolov8seg、yolov8obb 的 DFL 放在模型中和放在后处理…...

程序员找工作之操作系统面试题总结分析

程序员在找工作面试时&#xff0c;操作系统方面可能会被问到的问题涵盖了多个核心知识点和概念。以下是对这些面试问题的总结和分析&#xff1a; 1. 核心硬件与体系结构 微机的核心部件&#xff1a;询问微机硬件系统中最核心的部件是什么&#xff08;CPU&#xff09;。处理机…...

TypeScript 迭代器和生成器详解

目录 迭代器&#xff08;Iterators&#xff09; 生成器&#xff08;Generators&#xff09; 使用场景 for..of vs. for..in 语句 for..of 循环 for..in 循环 区别总结 注意事项 总结 在 TypeScript 中&#xff0c;迭代器&#xff08;Iterators&#xff09;和生成器&am…...

echarts 极坐标柱状图 如何定义柱子颜色

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

JavaScript模块化

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

文件包含漏洞Tomato靶机渗透_详解

一、导入靶机 将下载好的靶机拖入到VMware中&#xff0c;填写靶机机名称(随便起一个)和路径 虚拟机设置里修改网络状态为NAT模式 二、信息收集 1、主机发现 用御剑扫描工具扫描虚拟机的NAT网段&#xff0c;发现靶机的IP是192.168.204.141 2、端口扫描 用御剑端口扫描扫描全…...

湖北汽车工业学院-高等数学考纲

湖北汽车工业学院2024年普通专升本考试的《高等数学》考试大纲已经公布。考试形式为闭卷笔试&#xff0c;满分100分&#xff0c;考试时间为90分钟。考试内容主要包括以下几个部分&#xff1a; 1. **函数、极限、连续**&#xff1a; 涉及函数概念、表示法、有界性、周期性、奇偶…...

XCTF-web-easyupload

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

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

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; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

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

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; 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关&#xff0…...

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&#xff1f; 好多年没用了。重新整一下 还费了点时间&#xff0c;记录一下。 项目结构&#xff1a; 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开发&#xff0c;采用DevEco Studio实现&#xff0c;包含完整的游戏逻辑和UI界面。 2. 项目结构 /src/main/java/com/example/militarychess/├── MainAbilitySlice.java // 主界面├── GameView.java // 游戏核…...