实战Alibaba Sentinel:深度解析微服务高并发流量治理
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.2 Sentinel的特性

在不使用集群限流功能的情况下,Sentinel只是一个组件,不需要考虑高可用的问题,只要应用不出问题,Sentinel就不会出现不可用的问题,除非出现Bug。Sentinel Dashboard为Sentinel提供了一个可视化操作管理后台,通过网络通信从接入端收集指标数据,用于展示实时的QPS、限流、熔断等指标数据。Sentinel并不一定要依赖Sentinel Dashboard。

Sentinel以流量为切入点,实现从限流、熔断、系统负载保护等多个维度保护服务的稳定性。参考Sentinel官方文档,Sentinel的特性如表1.1所示。

表1.1 Sentinel的特性

1. Sentinel支持通过控制并行占用线程数提供信号量隔离

使用信号量隔离能够有效避免较耗时的接口影响正常接口,以致正常接口无法处理请求的情况出现。控制服务在同一时刻只能有n个线程去处理某个接口的请求,可避免因该耗时接口消耗了全部线程资源而导致服务不可用的现象出现。

2. Sentinel支持基于失败比率的熔断降级

当请求数超过服务的最大承受能力时,必然会出现大量请求的响应耗时飙升的情况,而超出阈值的请求数越多,最大响应耗时就越长,甚至会超过请求方配置的最大等待超时时间,这时就会出现大量的超时异常,也就是请求失败,所以失败次数与成功次数的比值也是判断一个服务实时状态的重要指标数据。

Sentinel支持基于失败比率的熔断降级,当请求超过指定的数量且失败比率达到设定的阈值时会触发熔断,并且在下一个时间窗口自动恢复。

3. Sentinel支持基于平均响应时间的熔断降级

平均响应时间越长,说明目标服务的性能越差。在响应时间持续飙升时,自动熔断可以防止慢调用造成级联阻塞。

4. Sentinel基于滑动窗口实现实时指标数据统计

指标数据统计指的是统计每个资源当前时间窗口内的请求总数、处理成功总数、失败总数、总耗时、平均耗时、最大耗时、最小耗时、被拒绝的请求总数等。使用滑动窗口可以循环利用一个数组,不需要重新申请内存,也不需要去删除过期的统计数据,从而降低GC的压力。

5. Sentinel提供灵活的规则动态配置

Sentinel提供的数据源接口可实现动态加载规则配置,结合loadRules API可灵活地修改规则配置,并且随时修改随时生效。

动态修改不仅支持修改某资源的规则配置,也支持添加新的资源规则配置或者移除资源规则配置。

Sentinel支持给同一个资源同时添加多种规则配置,当对同一个资源配置多种规则时,哪个规则先达到阈值就会触发哪个规则的降级。

6. Sentinel支持系统自适应限流

在集群环境下,通过负载均衡功能可以把本应这台机器承载的流量转发到其他的机器上。如果这个时候其他的机器也处在一个边缘状态,那么这个增加的流量就会导致这台机器崩溃,最后导致整个集群不可用。针对这个情况,Sentinel提供了系统自适应限流保护机制,该保护机制可以让系统的入口流量和系统的负载达到一个平衡,保证系统在能力范围之内处理更多的请求。

7. Sentinel流量控制支持多种模式,如直接拒绝模式、慢启动预热模式、匀速器模式

在QPS过高的情况下,直接拒绝超出限制的请求是最常见的实现方式,但在有些场景中可能并不希望直接拒绝请求,而是想让请求排队等待处理,如某一秒突增请求过多,但下一秒可能没有请求或者请求很少的场景。

8. Sentinel在框架的设计上使用责任链模式和SPI机制提供扩展功能

SPI机制为Sentinel提供了更好的扩展性,并且支持自定义调用链构建器。使用自定义调用链构建器可以实现按需选配流量控制策略,还可以自己添加自定义流量控制策略。

简单来说,我们可以实现自定义流量控制策略,或者根据需要选择Sentinel提供的流量控制策略,同时移除不需要的流量控制策略,尽量降低Sentinel对服务的性能影响。

9. Sentinel支持集群限流

除轮询负载均衡算法外,其他的算法都会导致到集群的每个节点的流量均不一样,有的多有的少。假设服务B部署了两个节点,每个节点配置的限流阈值均为200 QPS,而集群的整体限流阈值是400 QPS,但实际情况可能是,400个请求中可能有300个请求被分配到节点1,只有100个请求被分配到节点2,导致节点2的总体流量没有达到200QPS就开始限流,因此单机维度限流无法精确地限制总体流量。

集群限流可以精确地控制整个集群的调用总量,结合单机限流便可以更好地发挥流量控制的效果。但实现集群限流需要使用一个Server专门统计集群的总调用量,且其他的实例都需要通过与Server通信来判断是否可以被调用,这也意味着每个请求都需要增加一次额外的与Server通信的消耗。不过使用单一长连接和Server处理“判断是否能通过”的耗时非常短,因此这个消耗对性能的影响还是可以接受的。

10. Sentinel支持黑白名单限流

黑白名单限流可以根据请求来源判断来源是否在黑名单中,如果在黑名单中,则拒绝请求,否则放行。结合Sentinel的灵活动态配置,黑白名单可用于在高峰时期对某些接口的某些调用来源(服务消费者)限流。

11. Sentinel支持对热点参数限流

Sentinel按照调用SphU类的entry方法传入参数中的热点参数分别统计资源指标数据,根据配置的限流阈值对包含热点参数的资源调用进行限流。

热点参数限流仅对包含热点参数的资源调用生效,Sentinel利用LRU策略统计最近最常被访问的热点参数,结合令牌桶算法进行参数级别的限流,并且支持匀速限流效果。

Sentinel有灵活的规则配置,其提供的多种限流功能基本满足了使用者的需求,并提供了SPI,以便扩展Sentinel的功能,上述优点奠定了Sentinel在熔断器组件中的地位。