Sentinel由阿里巴巴中间件团队开源。是一个轻量级、高可用的分布式服务架构流控组件。用户保护服务的稳定性。你可能会问:Sentinel和之前常用的熔断器库NetflixHystrix有什么异同?本文将从多个角度对比Sentinel和Hystrix,帮助大家进行技术选型。概述先来看看官方对Hystrix的介绍:Hystrix是一个通过添加延迟容错和容错逻辑来帮助你控制这些分布式服务之间交互的库??。Hystrix通过隔离服务之间的访问点、停止它们之间的级联故障并提供回退选项来实现这一点,所有这些都提高了系统的整体弹性。可以看出Hystrix的重点是基于隔离和熔断的容错机制。超时或者熔断调用会很快失败,可以提供fallback机制。Sentinel的重点是:多样化的流量控制、断路器、系统负载保护、实时监控和控制台。可见两者所解决的问题是截然不同的。让我们分别比较一下。常见特征资源模型与执行模型对比Hystrix的资源模型设计采用命令模式,将外部资源的调用和回退逻辑封装到命令对象(HystrixCommand/HystrixObservableCommand)中,其底层执行基于RxJava实现.每个Command创建时,必须指定commandKey和groupKey(用于区分资源)和对应的隔离策略(线程池隔离或信号量隔离)。在线程池隔离模式下,需要配置线程池对应的参数(线程池名称、容量、排队超时时间等),然后Command会根据指定的容错策略在指定的线程池中执行;在信号量隔离模式下,需要配置最大并发数,Hystrix会在Command执行时限制其并发调用。Sentinel的设计更简单。与HystrixCommand的强依赖隔离规则相比,Sentinel的资源定义和规则配置的耦合度较低。Hystrix的Command之所以强烈依赖隔离规则的配置,是因为隔离规则会直接影响到Command的执行。Hystrix在执行过程中会分析Command的隔离规则,创建RxJavaScheduler并在其上调度执行。如果是线程池模式,Scheduler最底层的线程池就是配置好的线程池。如果是信号量模式,就简单的打包到当前线程执行。调度程序。Sentinel不指定执行模型,也不关心应用程序是如何执行的。Sentinel的原理很简单:根据相应资源配置的规则,对资源执行相应的限流/降级/负载保护策略。资源定义和规则配置在Sentinel中是分开的。用户首先通过SentinelAPI为相应的业务逻辑定义资源(埋点),然后在需要的时候配置规则。埋点方法有两种:try-catch方法(通过SphU.entry(...)),用户在catch块中进行异常处理/fallbackif-else方法(通过SphO.entry(...)),返回时执行异常处理/回退时为假。从0.1.1版本开始,Sentinel也支持基于注解的资源定义方式,可以通过注解参数指定异常处理函数和回退函数。从0.2.0版本开始,Sentinel引入了对异步调用链接的支持,可以方便的统计异步调用资源的数据,维护异步调用链接,具备适配异步框架/库的能力。Sentinel提供了多种规则配置方式。除了通过loadRulesAPI直接将规则注册到内存状态外,用户还可以注册各种外部数据源来提供动态规则。用户可以根据系统当前的实时情况动态更改规则配置,数据源会将更改推送到Sentinel并立即生效。隔离设计中的对比隔离是Hystrix的核心功能之一。Hystrix提供了两种隔离策略:线程池隔离(BulkheadPattern)和信号量隔离,其中最推荐和最常用的是线程池隔离。Hystrix的线程池隔离为不同的资源创建不同的线程池。不同的服务调用发生在不同的线程池中。当线程池出现排队、超时等情况时,可以快速失效,提供回退机制。线程池隔离的好处是隔离度比较高,可以针对一个资源的一个线程池进行处理,不会影响其他资源,但是代价是线程上下文切换的开销比较大,特别是对于低-延迟调用。影响。然而,在实践中,线程池隔离并没有带来太大的好处。首先是线程池太多会极大地影响性能。考虑这样一个场景,在Tomcat这样的Servlet容器中使用Hystrix,Tomcat本身的线程数是非常多的(可能几十个,上百个),如果加上Hystrix为每个资源创建的线程池,总数ofthreads的数量会非常大(数百个线程),因此上下文切换会有非常大的损失。另外,线程池模式相对彻底的隔离,使得Hystrix可以分别处理不同资源线程池的排队和超时,但这其实是超时熔断和流控要解决的问题。如果组件有超时熔断和流控能力,线程池隔离就没那么必要了。Hystrix的信号量隔离限制了对资源的并发调用数。这种隔离是非常轻量级的。它只是限制对某个资源的并发调用数,而不是显式创建线程池,所以开销比较小,但是效果不错,而且还支持超时失败。Sentinel可以通过并发线程数模式的流量控制来提供信号量隔离的功能。并且结合基于响应时间的熔断降级模式,可以在不稳定资源的平均响应时间比较高的时候自动降级,防止过多的慢调用占用并发数影响整个系统。断路器比较Sentinel和Hystrix的断路器功能本质上都是基于CircuitBreakerPattern。Sentinel和Hystrix都支持基于故障率(异常率)的熔断降级。当调用达到一定程度,故障率达到设定的阈值时,自动进行熔断。此时,所有对该资源的调用都将被阻塞,直到在指定的时间窗口后试探性地恢复。上面说了,Sentinel也支持基于平均响应时间的熔断降级,可以在服务响应时间持续飙升的时候自动熔断,拒绝更多的请求,直到一段时间后才恢复。这可以防止调用非常慢的级联阻塞情况。实时指标统计实现对比Hystrix和Sentinel的实时指标数据统计实现都是基于滑动窗口的。Hystrix1.5之前的版本是通过环形数组实现的滑动窗口,通过锁和CAS操作来更新每个bucket的统计信息。Hystrix1.5开始重构指标实时统计的实现,将指标统计的数据结构抽象为反应流(reactivestream)的形式,方便消费者使用指标信息。同时底层基于RxJava改造为事件驱动模式,在服务调用成功/失败/超时时释放相应的事件。通过一系列的转换和聚合,最终得到一个实时的指标统计数据流,可以被fuses或者Dashboards消费。Sentinel目前抽象了Metric指标统计接口,底层可以有不同的实现。当前默认实现是基于LeapArray的高性能滑动窗口。后期可能会根据需要引入reactivestreams等实现。Sentinel的特点除了上述两者的共同特点外,Sentinel还提供了以下特点:轻量级、高性能Sentinel是一个功能齐全的高可用流控组件,其核心sentinel-core无冗余依赖,打包后不到200KB,非常轻巧。开发人员可以安全地引入sentinel-core而无需担心依赖性。同时,Sentinel提供了多种扩展点,用户可以根据需要轻松扩展,无缝融入Sentinel。引入Sentinel带来的性能损失很小。只有当业务单机级别超过25WQPS时才会有一些明显的影响(大概5%-10%)。在单机QPS不太大的时候,损失几乎可以忽略不计。流控哨兵可以针对不同的调用关系,根据不同的运行指标(如QPS、并发调用数、系统负载等)来控制资源调用的流向,将随机请求调整为合适的形状。Sentinel支持多种流量整形策略,可以在QPS过高时自动调整流量到合适的shape。常用的有:直接拒绝模式:即直接拒绝超出的请求。慢启动预热模式:当流量急剧增加时,控制流量,让通过流量缓慢增加,在一定时间内逐渐增加到上限阈值,给冷系统一个预热时间,避免冷系自不堪重负。匀速模式:LeakyBucket算法实现的匀速模式,严格控制请求通过的时间间隔。同时对累积的请求进行排队,超过超时时间的请求直接拒绝。Sentinel还支持基于调用关系的限流,包括基于调用者限流、基于调用链表项限流、关联流量限流等,依托Sentinel强大的调用链路统计,可以提供不同维度的精准限流。Sentinel0.2.0开始支持热点参数限流,可以实时统计热点参数,控制热点参数的资源调用流量。系统负载保护Sentinel为系统维度提供保护,负载保护算法借鉴了TCPBBR的思想。当系统负载较高时,如果请求不断进入,可能会导致系统崩溃,无法响应。在集群环境下,网络负载均衡会将本应由本机承载的流量转发给其他机器。如果此时其他机器也处于边缘状态,增加的流量会导致这台机器崩溃,最终导致整个集群不可用。针对这种情况,Sentinel提供了相应的保护机制,在系统的入口流量和系统的负载之间取得平衡,保证系统在能力范围内处理最多的请求。实时监控控制面板Sentinel提供HTTPAPI获取实时监控信息,如调用链路统计、集群信息、规则信息等,如果用户使用的是SpringBoot/SpringCloud和SentinelSpringCloudStarter,可以也可以通过其暴露的ActuatorEndpoint方便的获取一些运行时信息,比如动态规则。未来,Sentinel还将支持标准化的指标监控API,可以轻松集成各种监控系统和可视化系统,如Prometheus、Grafana等。Sentinel控制台(Dashboard)提供机器发现、配置规则、查看实时等功能-时间监控、查看调用链接信息等,方便用户查看监控和配置。生态Sentinel已经适配Servlet、Dubbo、SpringBoot/SpringCloud、gRPC等,用户只需要引入相应的依赖,进行简单的配置,就可以非常方便的享受Sentinel的高可用流量保护能力。未来,Sentinel也会适配更多的通用框架,为ServiceMesh提供保护集群流量的能力。总结最后用一张表进行对比总结:SentinelHystrix隔离策略信号量隔离线程池隔离/信号量隔离熔断降级策略根据响应时间或故障率根据故障率实时指标实现滑动窗口滑动窗口(基于RxJava))规则配置支持多数据源,支持多数据源,可扩展,以插件的形式支持多扩展点。Annotation-basedsupport支持基于QPS的限流和基于调用关系的限流。保护支持不支持控制台开箱,可以配置规则,查看秒级监控,机器发现等不完善的常用框架适配Servlet,SpringCloud,Dubbo,gRPC等Servlet,SpringCloudNetflix参考:https://github.com/alibaba/Se...近期热点文章推荐:1.1,000+Java面试题及答案(2022最新版)2.厉害了!Java协程来了。..3.SpringBoot2.x教程,太全面了!4.不要用爆破爆满画面,试试装饰者模式,这才是优雅的方式!!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!
