个人做网站有什么坏处,大连爱得科技网站建设公司怎么样,网站开发与应用论文百度文库,网站的开发技术这篇文章总结一下应用保护的手段。如今说到应用保护#xff0c;更多的会想到阿里的sentinel#xff0c;手段丰富#xff0c;应用简单。sentinel的限流、降级、熔断#xff0c;可以自己去试一下#xff0c;sentinel主要通过配置实现功能#xff0c;不难。sentinel的简介放…这篇文章总结一下应用保护的手段。如今说到应用保护更多的会想到阿里的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系统串行化比率指串行执行代码所占比率为FCPU数目为N
Speedup 1 / (F (1-F)/N)四隔离
隔离不是只有在熔断时对下游服务器进行隔离广义上的隔离方式如下
1数据隔离数据重要性排序也就要垂直分库、垂直分表。
2机器隔离给重要的用户单独配置服务器。用户的标识去路由。
3线程池隔离每个需要线程池的业务单独分配线程池。hystrix。
4信号量隔离给某个业务或请求单独分配一个计数器。hystrix。
5集群隔离对服务进行分组在注册中心做这个事如秒杀服务单独分出一组服务给核心业务
6机房隔离不同的服务不要放在同一个机房。
7读写隔离搭建数据库的主从与读写分离用户的create update delete \ select 请求也要进行相应的分离。
8动静隔离识别动静态数据进行分流与隔离。nginxapache。
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实践