sentinel-client
Sentinel以流量为切入点,从流量控制、熔断降级、系统保护等多个维度来帮助您保障服务的稳定性,提供更专业稳定的流量防护手段、秒级的流量水位分布分析功能。
使用场景
Sentinel广泛用于秒杀场景、消息削峰填谷、集群流量控制、实时熔断等场景中,从多个维度保障您的业务稳定性。
在一个常见的分布式应用中,如下图所示。一个请求先通过终端到达 Gateway,再经过防火墙和网络负载均衡,其中还包括调用下游的其它服务和第三方应用,才能到达前端网络服务。AHAS 应用流控降级在不同的层次以流量为切面提供秒级实时的流量分析(例如在客户端层提供流量实时监控和水位诊断分析功能),帮助运维人员采取针对性的防护措施,全方位地保护应用的稳定性。
基本原则
- Sentinel 是围绕着资源来工作的。
- 编码时,只需要关心如何定义资源,即哪些方法/代码块需要保护,而不需要关注如何保护这个资源。
- 通过添加规则来保护资源,规则添加即时生效。
规则配置原则
- 按照应用处理能力进行流控:
- 按服务提供方流控原则
- 削峰填谷原则
- 冷启动原则
- 联动控制原则
- 强依赖隔离原则
- 弱依赖降级原则
- 系统保护原则,详情请参见[系统保护篇]
弱依赖降级
当若依赖的第三方应用出错不会影响而整体流程,则称之为弱依赖。对于弱依赖不稳定时,需要配置降级原则来保护系统稳定性。
在实际业务中,应用通常会调用依赖方(远程服务、数据库、第三方 API 等)来完成服务。例如,支付的时需要远程调用银联提供的 API。然而依赖方的稳定性是不能保证的。若依赖方出现不稳定的情况,则请求和调用依赖方的方法的的响应时间变长,线程产生堆积,最终可能耗尽自身的线程数,导致应用本身不可用。
在复杂链路中,若某一环不稳定,就可能会层层渲染,最终导致整个链路都不可用。
针对以上情况,可以使用对依赖方配置降级原则来保证系统稳定性。
###强依赖隔离
若依赖的第三方应用或组件,或者应用自身的内部方法出错会影响而整体流程,则称之为强依赖。对于强依赖,需要配置隔离原则来保护系统稳定性。
当强依赖出现不稳定的时候,可以通过配置并发线程数隔离原则来限制不稳定的强依赖并发数,隔离强依赖。配置并发线程数隔离原则后,无需再进行线程池隔离,sentinel 会控制资源的线程数。当请求数超过阈值时,sentinel 将拒绝多余的请求,直到堆积的线程处理完成,以此来达到信号量隔离的效果。
线程数目超出时,设置 快速失败 能够有效地防止自己被慢调用所影响。
系统防护
系统防护即从整体维度对应用入口流量进行控制,结合应用的 Load、总体平均 RT、入口 QPS 和线程数等几个维度的监控指标,让系统的入口流量和系统的负载达到一个平衡,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。
一般性系统自适应保护的思路是根据硬指标即系统的负载来做系统过载保护。即当系统负载高于某个阈值,就禁止或者减少流量的进入;若负载恢复,则恢复流量的进入。这样会造成两个不可避免的问题:
- 若根据负载的情况来调节流量的通过率,则会产生延迟。若当前通过率的调整会导致负载增大,那么至少要过 1 秒之后才能被观测到;同理,若当前通过率调整会使负载降低,也需要 1 秒之后才能继续调整。这种方法会浪费系统的处理能力。导致我们看到的负载曲线产生锯齿。
- 通过率恢复慢。在下游应用不可靠,应用响应时间很长,从而导致负载很高的场景中,若下游应用恢复时,应用响应时间也会随之减短,此时通过率理应会大幅度增大。但由于此时负载仍然很高,所以通过率的恢复慢。
为解决上述问题,sentinel在系统自适应保护的做法是:用每分钟的负载作为启动控制流量,使用请求的响应时间以及当前系统正在处理的请求速率来决定通过的流量。旨在在系统不被拖垮的情况下,提高系统的吞吐率。