技术选型:Sentinel vs Hystrix

这是围绕 Sentinel 的使用场景、技术对比和实现、开发者实践等维度推出的系列文章的第三篇。

» 第一篇回顾:

Dubbo 的流量防卫兵 | Sentinel如何通过限流实现服务的高可用性 - 传送门

» 第二篇回顾:

RocketMQ 的保险丝| Sentinel 如何通过匀速请求和冷启动来保障服务的稳定性 - 传送门

Sentinel 是阿里中间件团队研发的面向分布式服务架构的轻量级高可用流量控制组件,于今年7月正式开源。Sentinel 主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助用户提升服务的稳定性。大家可能会问:Sentinel 和之前经常用到的熔断降级库 Netflix Hystrix 有什么异同呢?本文将从资源模型和执行模型、隔离设计、熔断降级、实时指标统计设计等角度将 Sentinel 和 Hystrix 进行对比,希望在面临技术选型的时候,对各位开发者能有所帮助。

一、总体说明

先来看一下 Hystrix 的官方介绍:

Hystrix is a library that helps you control the interactions between these distributed services by adding latency tolerance and fault tolerance logic. Hystrix does this by isolating points of access between the services, stopping cascading failures across them, and providing fallback options, all of which improve your system’s overall resiliency.

可以看到 Hystrix 的关注点在于以隔离和熔断为主的容错机制,超时或被熔断的调用将会快速失败,并可以提供 fallback 机制。

而 Sentinel 的侧重点在于:

  • 多样化的流量控制
  • 熔断降级
  • 系统负载保护
  • 实时监控和控制台

可以看到两者解决的问题还是有比较大的不同的,下面我们来具体对比一下。

二、共同特性

1、资源模型和执行模型上的对比

Hystrix 的资源模型设计上采用了命令模式,将对外部资源的调用和 fallback 逻辑封装成一个命令对象(HystrixCommand/ HystrixObservableCommand),其底层的执行是基于 RxJava 实现的。每个 Command 创建时都要指定 commandKey 和 groupKey(用于区分资源)以及对应的隔离策略(线程池隔离 or 信号量隔离)。线程池隔离模式下需要配置线程池对应的参数(线程池名称、容量、排队超时等),然后 Command 就会在指定的线程池按照指定的容错策略执行;信号量隔离模式下需要配置最大并发数,执行 Command 时 Hystrix 就会限制其并发调用。

Sentinel 的设计则更为简单。相比 Hystrix Command 强依赖隔离规则,Sentinel 的资源定义与规则配置的耦合度更低。Hystrix 的 Command 强依赖于隔离规则配置的原因是隔离规则会直接影响 Command 的执行。在执行的时候 Hystrix 会解析 Command 的隔离规则来创建 RxJava Scheduler 并在其上调度执行,若是线程池模式则 Scheduler 底层的线程池为配置的线程池,若是信号量模式则简单包装成当前线程执行的 Scheduler。

而Sentinel则不一样,开发的时候只需要考虑这个方法/代码是否需要保护,置于用什么来保护,可以任何时候动态实时的区修改。

从 0.1.1 版本开始,Sentinel 还支持基于注解的资源定义方式,可以通过注解参数指定异常处理函数和 fallback 函数。Sentinel 提供多样化的规则配置方式。除了直接通过 loadRules API 将规则注册到内存态之外,用户还可以注册各种外部数据源来提供动态的规则。用户可以根据系统当前的实时情况去动态地变更规则配置,数据源会将变更推送至 Sentinel 并即时生效。

2、隔离设计上的对比

隔离是 Hystrix 的核心功能之一。Hystrix 提供两种隔离策略:线程池隔离(Bulkhead Pattern)和信号量隔离,其中最推荐也是最常用的是线程池隔离。Hystrix 的线程池隔离针对不同的资源分别创建不同的线程池,不同服务调用都发生在不同的线程池中,在线程池排队、超时等阻塞情况时可以快速失败,并可以提供 fallback 机制。线程池隔离的好处是隔离度比较高,可以针对某个资源的线程池去进行处理而不影响其它资源,但是代价就是线程上下文切换的 overhead 比较大,特别是对低延时的调用有比较大的影响。

但是,实际情况下,线程池隔离并没有带来非常多的好处。最直接的影响,就是会让机器资源碎片化。考虑这样一个常见的场景,在 Tomcat 之类的 Servlet 容器使用 Hystrix,本身 Tomcat 自身的线程数目就非常多了(可能到几十或一百多),如果加上 Hystrix 为各个资源创建的线程池,总共线程数目会非常多(几百个线程),这样上下文切换会有非常大的损耗。另外,线程池模式比较彻底的隔离性使得 Hystrix 可以针对不同资源线程池的排队、超时情况分别进行处理,但这其实是超时熔断和流量控制要解决的问题,如果组件具备了超时熔断和流量控制的能力,线程池隔离就显得没有那么必要了。

Hystrix 的信号量隔离限制对某个资源调用的并发数。这样的隔离非常轻量级,仅限制对某个资源调用的并发数,而不是显式地去创建线程池,所以 overhead 比较小,但是效果不错。但缺点是无法对慢调用自动进行降级,只能等待客户端自己超时,因此仍然可能会出现级联阻塞的情况。

Sentinel 可以通过并发线程数模式的流量控制来提供信号量隔离的功能。并且结合基于响应时间的熔断降级模式,可以在不稳定资源的平均响应时间比较高的时候自动降级,防止过多的慢调用占满并发数,影响整个系统。

3、熔断降级的对比

Sentinel 和 Hystrix 的熔断降级功能本质上都是基于熔断器模式(Circuit Breaker Pattern)。Sentinel 与 Hystrix 都支持基于失败比率(异常比率)的熔断降级,在调用达到一定量级并且失败比率达到设定的阈值时自动进行熔断,此时所有对该资源的调用都会被 block,直到过了指定的时间窗口后才启发性地恢复。上面提到过,Sentinel 还支持基于平均响应时间的熔断降级,可以在服务响应时间持续飙高的时候自动熔断,拒绝掉更多的请求,直到一段时间后才恢复。这样可以防止调用非常慢造成级联阻塞的情况。

4、实时指标统计实现的对比

Hystrix 和 Sentinel 的实时指标数据统计实现都是基于滑动窗口的。Hystrix 1.5 之前的版本是通过环形数组实现的滑动窗口,通过锁配合 CAS 的操作对每个桶的统计信息进行更新。Hystrix 1.5 开始对实时指标统计的实现进行了重构,将指标统计数据结构抽象成了响应式流(reactive stream)的形式,方便消费者去利用指标信息。同时底层改造成了基于 RxJava 的事件驱动模式,在服务调用成功/失败/超时的时候发布相应的事件,通过一系列的变换和聚合最终得到实时的指标统计数据流,可以被熔断器或 Dashboard 消费。

Sentinel 目前抽象出了 Metric 指标统计接口,底层可以有不同的实现,目前默认的实现是基于 LeapArray 的滑动窗口,后续根据需要可能会引入 reactive stream 等实现。

三、Sentinel 特性

除了之前提到的两者的共同特性之外,Sentinel 还提供以下的特色功能:

1、轻量级和高性能

Sentinel 作为一个功能完备的高可用流量管控组件,其核心 sentinel-core 没有任何多余依赖,打包后只有不到 200 KB,非常轻量级。开发者可以放心地引入 sentinel-core 而不需担心依赖问题。同时,Sentinel 提供了多种扩展点,用户可以很方便地根据需求去进行扩展,并且无缝地切合到 Sentinel 中。

引入 Sentinel 带来的性能损耗非常小。只有在业务单机量级超过 25W QPS 的时候才会有一些显著的影响(5% - 10% 左右),单机 QPS 不太大的时候损耗几乎可以忽略不计。

2、流量控制

Sentinel 可以针对不同的调用关系,以不同的运行指标(如 QPS、并发调用数、系统负载等)为基准,对资源调用进行流量控制,将随机的请求调整成合适的形状。

Sentinel 支持多样化的流量整形策略,在 QPS 过高的时候可以自动将流量调整成合适的形状。常用的有:

  • 直接拒绝模式:即超出的请求直接拒绝。
  • 慢启动预热模式:当流量激增的时候,控制流量通过的速率,让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮。

image

  • 匀速器模式:利用 Leaky Bucket 算法实现的匀速模式,严格控制了请求通过的时间间隔,同时堆积的请求将会排队,超过超时时长的请求直接被拒绝。Sentinel 还支持基于调用关系的限流,包括基于调用方限流、基于调用链入口限流、关联流量限流等,依托于 Sentinel 强大的调用链路统计信息,可以提供精准的不同维度的限流。

image

目前 Sentinel 对异步调用链路的支持还不是很好,后续版本会着重改善支持异步调用。

3、系统负载保护

Sentinel 对系统的维度提供保护,负载保护算法借鉴了 TCP BBR 的思想。当系统负载较高的时候,如果仍持续让请求进入,可能会导致系统崩溃,无法响应。在集群环境下,网络负载均衡会把本应这台机器承载的流量转发到其它的机器上去。如果这个时候其它的机器也处在一个边缘状态的时候,这个增加的流量就会导致这台机器也崩溃,最后导致整个集群不可用。针对这个情况,Sentinel 提供了对应的保护机制,让系统的入口流量和系统的负载达到一个平衡,保证系统在能力范围之内处理最多的请求。

image

4、实时监控和控制面板

Sentinel 提供 HTTP API 用于获取实时的监控信息,如调用链路统计信息、簇点信息、规则信息等。如果用户正在使用 Spring Boot/Spring Cloud 并使用了Sentinel Spring Cloud Starter,还可以方便地通过其暴露的 Actuator Endpoint 来获取运行时的一些信息,如动态规则等。未来 Sentinel 还会支持标准化的指标监控 API,可以方便地整合各种监控系统和可视化系统,如 Prometheus、Grafana 等。

Sentinel控制台(Dashboard)提供了机器发现、配置规则、查看实时监控、查看调用链路信息等功能,使得用户可以非常方便地去查看监控和进行配置。

image

5、生态

Sentinel 目前已经针对 Servlet、Dubbo、Spring Boot/Spring Cloud、gRPC 等进行了适配,用户只需引入相应依赖并进行简单配置即可非常方便地享受 Sentinel 的高可用流量防护能力。未来 Sentinel 还会对更多常用框架进行适配,并且会为 Service Mesh 提供集群流量防护的能力。

四、总结

image


原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/521101.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

“熬夜导致秃头”,因果关系推断说这话有问题!

扫码了解2019中国大数据技术大会(https://t.csdnimg.cn/7yMh )更多详情。“因果”,顾名思义,即“原因与结果”。“推理”则指“根据某个事件推导其他事件,即经过推测和推断得出结论的过程”。换句话说,就是…

大数据可视化html模板开源_8个可靠好用的开源数据可视化工具推荐

数据可视化在数据科学领域中发挥着重要的作用。在不清楚数据的情况下,要监视和调整数据以使其按照应有的方式执行并不容易。这就是数据可视化发挥作用的地方,它把收集到的数据放到一个可视的上下文中,使数据更容易找出模式、跟踪趋势等。但是…

MaxCompute - ODPS重装上阵 第五弹 - SELECT TRANSFORM

MaxCompute(原ODPS)是阿里云自主研发的具有业界领先水平的分布式大数据处理平台, 尤其在集团内部得到广泛应用,支撑了多个BU的核心业务。 MaxCompute除了持续优化性能外,也致力于提升SQL语言的用户体验和表达能力,提高…

RabbitMQ 最新版本 下载、部署 _rpm版本(CentOS7环境)

文章目录1. 安装rabbitmq前要准备的基础环境2. wget 远程下载安装包2. rpm安装软件3. 编辑配置文件修改密码4. 启动RabbitMQ5. 查看RabbitMQ是否启动6. 安装RabbitMQ 管控台7. 浏览器访问:8. 登录1. 安装rabbitmq前要准备的基础环境 yum install build-essential o…

MaxCompute存储力持续升级,每年节省不止一个亿

数据是开启全新洞察和机器智能创新的基础,拥有高性能、稳定、可扩展性强的存储能力和充沛的计算力,才能全面释放数据价值。 阿里巴巴大数据计算平台MaxCompute,作为阿里巴巴统一的计算平台,支持了整个阿里巴巴集团内部几乎99%的数…

【10.23头条】阿里云存储负责人吴结生:安全可靠是云存储立身之本, 智能技术将激活存储技术新变革...

戳蓝字“CSDN云计算”关注我们哦!作者 | 刘丹责编 | 阿秃人类以日新月异的速度刷新着科技的成果,其中存储的发展历史尤其悠久,堪称万年进化史。自文明诞生以来,我们就一直在寻求能够更有效存储信息的方式,从4万年前的…

专访20年技术老兵云郎:16年峰回路,每一步都是更好的沉淀

从技术研发到产品经理 3次峰回路转 这条路,他走了16年 一个懂技术的产品 更有底气和研发“叫板” 一个具备产品思维的技术 更明白未来的方向 张良模,花名云郎。1997年入行做通信软件研发;8年后转型IT行业,曾任Oracle(甲…

子网规划与组网实验_【干货】从0到1,“大型WLAN组网”基础知识分享~

点击蓝字 关注我们 目前,大多数企业办公环境同时使用有线和无线网络来支撑业务。办公区在提供有线网口的同时,也采用全Wi-Fi覆盖,办公环境更为开放和智能。未来,企业云桌面办公、智真会议、4K视频等大带宽业务将从有线网络迁移至无…

搭建集群 RabbitMQ SHELL脚本实战_03

接上一篇: (企业级) 搭建集群RabbitMQ 快速下载、安装、配置、部署_02 文章目录一、shell脚本说明1. 选择脚本的原因2. 脚本总览二、脚本实战2.1. 工具依赖包2.2. wget 远程下载安装包2.3. rpm安装软件2.4. 编辑配置文件修改密码2.5. 启动RabbitMQ2.6. 查看RabbitMQ…

欧洲为何没有牛逼的互联网公司

戳蓝字“CSDN云计算”关注我们哦!作者 | 挖数责编 | 阿秃截至2018年底,全球市值最大的21家互联网科技公司里边,美国有12家,中国有9家,没有一家欧洲公司。在国内BAT搅动风云,美国亚马逊的贝索斯坐上全球首富…

混合云存储开启企业上云新路径--阿里云混合云备份容灾方案发布

当前,数据已经成为了企业的核心资产。而如果数据中心发生故障不仅会给企业带来巨大损失,甚至会直接迫使企业走向倒闭。对于企业而言,每一字节业务数据的丢失都是一场重大的灾难!那么,如何保证企业的核心数据资产不丢失…

java导出pdf_一张PDF了解JDK11 GC调优秘籍-附PDF下载

简介JDK11相比JDK10,添加了一个新的Source-File Mode,可以直接通过java来运行单个java源文件,而不需要进行编译。同时还提供了新的HTTP API,支持响应性stream。当然上面的都不是重点,重点的是JDK11是一个LTS版本&#…

RabbitMQ 普通集群配置_04

接上一篇:(企业级) 搭建集群 RabbitMQ SHELL脚本实战_03 文章目录RabbiMQ简介RabbiMQ模式RabbiMQ特点环境部署总览一、基础配置及RabbitMQ 安装1. 配置hosts文件2. 安装配置RabbitMQ3. 思路分析二、RabiitMQ 集群配置同步2.1. 拷贝erlang.cookie2.2. 同步.erlang.co…

java 百度api接口开发_百度熊掌号使用Java工具类对接API推送接口进行文章推送实例详解...

对于java程序员来说,自己运维的百度熊掌号当然得使用java的方式去每天推送文章了。目前,百度推出了百度熊掌号服务。旨在更好的为站长服务。那么百度熊掌号如何通过推送API接口实现自动文章推送呢?第一步:注册注册百度熊掌号&…

RabbitMQ 集群搭建_02_rpm版本(linux环境)

接上一篇:(企业级) CentOS7 安装 RabbitMQ最新版本 下载、安装、配置、运行、部署_01 文章目录一、SHELL脚本说明1. 选择脚本的原因2. 脚本总览二、脚本实战2.1. 安装rabbitmq前要准备的基础环境2.2. wget 远程下载安装包2.3. rpm安装软件2.4. 编辑配置文件修改密码…

力荐联邦学习系统,据说英伟达Clara“上架”新进展!

戳蓝字“CSDN云计算”关注我们哦!作者 | 晶少责编 | 阿秃这是晶少本年度第二次面访Kimberly Powell,这位英伟达医疗领域的美女副总裁。除了一贯的nice之外,更重要的一点,在深圳MICCAI 2019期间,英伟达医疗团队还带来了…

设置线程当天十二点执行_这份JAVA多线程笔记真的是细节满满,几乎全是你工作能用到的干货...

前言1:发挥多核CPU的优势(充分利用cpu资源)如果是单线程的程序,那么在双核CPU上就浪费了50%,在4核CPU上就浪费了75%。单核CPU上所谓的”多线程”那是假的多线程,同一时间处理器只会处理一段逻辑,只不过线程之间切换得比较快&#…

java多参方法_Java中多参数方法进阶

多参数方法的问题相信很多人曾经都写过多参数的构造方法,就像下面示例的代码。当想要创建一个给全部属性赋值的实例的时候,就会利用这个多参数的构造方法。但是,当类的属性特别多的时候,你还会这么写吗?如果你写了一个…

Pod Preset玩转K8S容器时区自动配置

缘由 默认的情况,在K8S里启动一个容器,该容器的设置的时区是UTC0,但是对于很多客户而言,其主机环境并不在UTC0。例如中国客户在UTC8。如果不把容器的时区和主机主机设置为一致,则在查找日志等时候将非常不方便&#x…

泪目!连拿3份 offer,AI 程序员求职经历火爆 IT圈!

程序员,如果有一天,你突然“被裁员”会怎么样?最近在知乎上浏览,看到这样一则内容:2019年,被裁员怎么挺过来?来源:知乎:https://www.zhihu.com/question/314153857其中这…