sentinel功能点
- 流控
qps
线程数 - 降级
RT:平均响应时间
异常比例:
异常数: - 热点
QPS 模式 - 授权
流控应用
黑白名单
概念解释
限流、熔断、隔离、降级
这四个概念是我们谈起微服务会经常谈到的概念,Sentinel 和 Hystrix 的原则是一致的
- 限流
当对服务进行限流(并发线程数或qps过高)时,超过的流量将直接fallback,即熔断。 - 熔断
- 当我的应用无法提供服务时,我要对上游请求熔断,避免上游把我压垮。
- 当我的下游依赖成功率过低时,我要对下游请求熔断,避免下游把我拖垮。
- 降级
- 降级与熔断紧密相关,熔断后业务如何表现,约定一个快速失败的fallback,即为服务降级。
- 隔离
- 业务之间不可互相影响,不同业务需要有独立的运行空间。
- 最彻底的,可以采用物理隔离,不同的机器部署。
- 次之,采用进程隔离,一个机器多个tomcat。
- 次之,请求隔离。
- 由于Hystrix框架所属的层级为代码层,所以实现的是请求隔离,线程池或信号量。
流量控制与熔断降级比较
::注意的是:限流是明确是由于并发过大导致,降级除了限流异步也可以是由于是业务异常导致::
流量控制(flow control),其原理是监控应用流量的 QPS 或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。
限流的直接表现是在执行 Entry nodeA = SphU.entry(resourceName) 的时候抛出 FlowException 异常。FlowException 是 BlockException 的子类,您可以捕捉 BlockException 来自定义被限流之后的处理逻辑。
try (Entry entry = SphU.entry("resourceName")) {
// 被保护的业务逻辑
// do something here...
} catch (BlockException ex) {
// 资源访问阻止,被限流
// 在此处进行相应的处理操作
}
熔断降级
除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。由于调用关系的复杂性,如果调用链路中的某个资源不稳定,最终会导致请求发生堆积。Sentinel 熔断降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联错误。当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断(默认行为是抛出 DegradeException)。
注意:异常降级仅针对业务异常,对 Sentinel 限流降级本身的异常(BlockException)不生效。为了统计异常比例或异常数,需要通过 Tracer.trace(ex) 记录业务异常。示例:
Entry entry = null;
try {
entry = SphU.entry(key, EntryType.IN, key);
// Write your biz code here.
// <<BIZ CODE>>
} catch (Throwable t) {
if (!BlockException.isBlockException(t)) {
Tracer.trace(t);
}
} finally {
if (entry != null) {
entry.exit();
}
}
总结:
- 异常不同:流量控制抛出 BlockException ,熔断降级抛出DegradeException
- 处理对象不同:流量控制只针对流量 ,不针对业务,熔断降级针对业务异常数或执行时间
热点参数限流
何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据,并对其访问进行限制。比如:
- 商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制
- 用户 ID 为参数,针对一段时间内频繁访问的用户 ID 进行限制
热点参数限流 · alibaba/Sentinel Wiki · GitHub
入口流量、出口流量
IN/OUT:IN 只对入口流量起作用,OUT对出口流量起作用
入口流量和出口流量有不同的控制方式
Sentinel工作主流程 · alibaba/Sentinel Wiki · GitHub