【架构】应用掩护

打印 上一主题 下一主题

主题 546|帖子 546|积分 1638

这篇文章总结一下应用掩护的本领。现在说到应用掩护,更多的会想到阿里的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并发编程实战》
  1. 为保持处理器达到期望的使用率,最优的池的大小等于:
  2. Nthreads = Ncpu x Ucpu x (1 + W/C)[1]
  3. 其中,
  4. Ncpu = CPU的数量
  5. Ucpu = 目标CPU的使用率, 0 <= Ucpu <= 1
  6. W/C = 等待时间与计算时间的比率
复制代码
公式2,《Java 虚拟机并发编程》
  1. 线程数 = Ncpu /(1 - 阻塞系数)[1]
  2. 公式1与公式2计算得出,
  3. 阻塞系数 = W / (W + C),
  4. 即阻塞系数 = 阻塞时间 /(阻塞时间 + 计算时间)
复制代码
定理1,阿姆达尔定理
Amdahl定律,定律定义了串行体系并行化后的加速比盘算公式[1],
  1. 加速比 = 优化前系统耗时 / 优化后系统耗时
复制代码
加速比越大,表明体系并行化的优化效果越好。Addahl定律还给出了体系并行度、CPU数目和加速比的关系,加速比为Speedup,体系串行化比率(指串行执行代码所占比率)为F,CPU数目为N:
  1. 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实践

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

欢乐狗

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表