写点什么

洋洋洒洒 2000 字带你了解微服务高并发知识:Sentinel 的特性

  • 2023-06-09
    湖南
  • 本文字数:2150 字

    阅读完需:约 7 分钟

Sentinel 的特性

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


Sentinel 以流量为切入点,实现从限流、熔断、系统负载保护等多个维度保护服务的稳定性。参考 Sentinel 官方文档,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 在熔断器组件中的地位。

用户头像

加VX:bjmsb02 凭截图即可获取 2020-06-14 加入

公众号:程序员高级码农

评论

发布
暂无评论
洋洋洒洒2000字带你了解微服务高并发知识:Sentinel的特性_Java_互联网架构师小马_InfoQ写作社区