【架构】应用保护
创始人
2024-09-26 04:18:09
0

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

相关内容

热门资讯

安卓10系统更新关闭,全面优化... 你知道吗?最近安卓系统又来了一次大动作,那就是安卓10系统的更新关闭了!这可真是让人有点摸不着头脑,...
安卓系统的文件加密,Andro... 你知道吗?在咱们这个数字化时代,保护隐私和安全变得比以往任何时候都重要。尤其是对于安卓系统用户来说,...
使用安卓系统的费用,全面了解使... 你有没有想过,为什么有些人拿着安卓手机,而有些人却选择了苹果?这其中可不仅仅是品牌喜好那么简单,使用...
vivo用原生安卓系统下载,尽... 你有没有发现,现在手机市场真是热闹非凡,各种品牌争奇斗艳,让人眼花缭乱。不过,今天我要给你安利的,可...
安卓系统好用的桌面时钟,实用好... 你有没有发现,手机里的时钟功能有时候比闹钟还重要呢?想象每天早上被它温柔地叫醒,或者在忙碌的工作间隙...
安卓系统导航车载用优盘,安卓车... 你有没有想过,开车的时候,手机导航虽然方便,但有时候屏幕太小,看不清路线?别急,今天就来给你安利一个...
正确使用电池安卓系统,无忧体验 你知道吗?现在这个智能手机时代,电池续航能力可是大家关注的焦点。尤其是安卓系统用户,电池使用得当与否...
玩吧安卓可以和苹果系统,畅享游... 你知道吗?现在这个时代,手机可是我们生活中不可或缺的好伙伴。不管是安卓还是苹果,它们各有各的特色,各...
安卓系统怎么去掉hd,恢复纯净... 你是不是也和我一样,对安卓手机的系统设置充满了好奇?尤其是那个让人眼花缭乱的“HD”标识,有时候看着...
电脑安卓系统性能表,电脑版性能... 你有没有发现,现在手机电脑的操作系统越来越丰富,尤其是安卓系统,简直就像是个万能的小精灵,啥都能干。...
如何玩转机车安卓系统,玩转机车... 你有没有想过,拥有一台酷炫的机车安卓系统,让你的手机瞬间变身成为一辆会跑的摩托车?想象你可以在手机上...
安卓系统网页怎么回顶部,按钮才... 你是不是在使用安卓系统的手机或平板电脑浏览网页时,不小心翻到了页面底部,现在想回到顶部,却有点摸不着...
为什么安卓系统要认证,安卓系统... 你知道吗?安卓系统最近可是掀起了一阵认证热潮,这可不仅仅是简单的更新换代那么简单哦!为什么安卓系统要...
安卓50原生系统手机,功能革新... 你有没有发现,最近你的安卓手机突然变得不一样了?是不是因为它的系统升级到了安卓50原生系统呢?没错,...
安卓永远比不了的系统,永远无法... 你有没有想过,为什么安卓系统永远比不了某些其他系统呢?是不是每次看到那些流畅无阻、功能强大的设备,心...
安卓8怎么升级11系统,解锁新... 你有没有发现,你的安卓手机已经有点儿“老态龙钟”了?别急,别急,今天就来教你怎么给它来个青春焕发的大...
双系统安卓笔记本,开启移动办公... 你有没有想过,一台既能流畅运行安卓应用,又能轻松驾驭Windows系统的笔记本,会是怎样的体验呢?没...
安卓系统调降噪通透软件,打造清... 你有没有发现,最近你的安卓手机在听音乐或者打电话的时候,声音变得超级清晰,仿佛置身于现场?这可不是你...
安卓系统包后缀名,包后缀名背后... 你有没有发现,每次下载安卓应用时,文件名后面总会有那么几个神秘的字母组合,像是“apk”、“jar”...
安卓系统好用的工作软件,盘点十... 你有没有发现,自从你把手机里的安卓系统升级后,工作效率好像提高了不少呢?今天,就让我来给你细细道来,...