hystrix熔断 简介

在过去的几天里,我一直在探索Netflix Hystrix库,并欣赏了这个出色的库所提供的功能。

引用Hystrix网站上的内容:

Hystrix是一个延迟和容错库,旨在隔离对远程系统,服务和第三方库的访问点,停止级联故障,并在不可避免发生故障的复杂分布式系统中实现弹性。

这里有很多关键字可以解析,但是在我看来,体验Hystrix的最佳方法是尝试一个示例用例。

不可预测的服务

考虑一个服务,一个奇怪的服务,它接受具有以下结构的json消息并返回确认:

{"id":"1","payload": "Sample Payload","throw_exception":false,"delay_by": 0
}

该服务接收有效负载,但另外还接收两个字段:delay_by使服务在延迟(以毫秒为单位)后确认响应,而“ throw_exceptions”字段将在指定的延迟后导致异常!

这是一个示例响应:

{"id":"1","received":"Sample Payload","payload":"Reply Message"
}

如果您一直遵循,这是该示例的 github存储库, 本示例已使用Netflix Karyon 2 ,并且可以通过以下方式非常简洁地表达处理请求的代码–了解如何放置rx-java库在这里很好地利用:

import com.netflix.governator.annotations.Configuration;
import rx.Observable;
import service1.domain.Message;
import service1.domain.MessageAcknowledgement;import java.util.concurrent.TimeUnit;public class MessageHandlerServiceImpl implements MessageHandlerService {@Configuration("reply.message")private String replyMessage;public Observable<MessageAcknowledgement> handleMessage(Message message) {logger.info("About to Acknowledge");return Observable.timer(message.getDelayBy(), TimeUnit.MILLISECONDS).map(l -> message.isThrowException()).map(throwException -> {if (throwException) {throw new RuntimeException("Throwing an exception!");}return new MessageAcknowledgement(message.getId(), message.getPayload(), replyMessage);});}}

在这一点上,我们有一个很好的候选服务,可以使其响应任意延迟和失败。

服务的客户

现在转到此服务的客户端。 我正在使用Netflix Feign进行此调用,这是另一个很棒的库,它所需要的只是用以下方式注释的Java接口:

package aggregate.service;import aggregate.domain.Message;
import aggregate.domain.MessageAcknowledgement;
import feign.RequestLine;public interface RemoteCallService {@RequestLine("POST /message")MessageAcknowledgement handleMessage(Message message);
}

它使用以下几行的配置来创建实现此接口所需的代理:

RemoteCallService remoteCallService = Feign.builder().encoder(new JacksonEncoder()).decoder(new JacksonDecoder()).target(RemoteCallService.class, "http://127.0.0.1:8889");

我有多个终结点,这些终结点将呼叫委派给该远程客户端,所有这些终结点都沿以下方式显示url模式– http:// localhost:8888 / noHystrix?message = Hello&delay_by = 0&throw_exception = false ,第一个是终结点的示例不使用Hystrix。

没有Hystrix案例

作为第一个示例,如果我尝试调用http:// localhost:8888 / noHystrix?message = Hello&delay_by = 5000&throw_exception = false或说http:// localhost:8888 / ,请考虑在没有Hystrix的情况下调用Remote服务。 noHystrix?message = Hello&delay_by = 5000&throw_exception = true ,在这两种情况下,用户对端点的请求只会在响应之前挂起5秒钟。

这里应该立即显示一些事情:

  1. 如果服务响应缓慢,则客户端对服务的请求将被迫等待响应返回。
  2. 在高负载下,处理用户流量的所有线程很可能会用尽,从而使进一步的用户请求失败。
  3. 如果服务抛出异常,则客户端将无法正常处理该异常。

显然,需要像Hystrix这样的东西来处理所有这些问题。

Hystrix命令包装远程调用

我在前一个案例中使用了50个用户负载进行了一次小负载测试,结果如下:

================================================================================
---- Global Information --------------------------------------------------------
> request count                                         50 (OK=50     KO=0     )
> min response time                                   5007 (OK=5007   KO=-     )
> max response time                                  34088 (OK=34088  KO=-     )
> mean response time                                 17797 (OK=17797  KO=-     )
> std deviation                                       8760 (OK=8760   KO=-     )
> response time 50th percentile                      19532 (OK=19532  KO=-     )
> response time 75th percentile                      24386 (OK=24386  KO=-     )
> mean requests/sec                                  1.425 (OK=1.425  KO=-     )

从服务中延迟5秒实质上会导致25秒的第75个百分位时间!,现在考虑使用Hystrix命令包装服务调用进行相同的测试:

================================================================================
---- Global Information --------------------------------------------------------
> request count                                         50 (OK=50     KO=0     )
> min response time                                      1 (OK=1      KO=-     )
> max response time                                   1014 (OK=1014   KO=-     )
> mean response time                                    22 (OK=22     KO=-     )
> std deviation                                        141 (OK=141    KO=-     )
> response time 50th percentile                          2 (OK=2      KO=-     )
> response time 75th percentile                          2 (OK=2      KO=-     )
> mean requests/sec                                 48.123 (OK=48.123 KO=-     )

奇怪的是,现在第75个百分位数的时间是2毫秒!这是怎么可能的,使用Hystrix提供的出色工具,答案变得显而易见,这是此测试的Hystrix仪表板视图:

此处发生的情况是前10个请求超时,默认情况下使用Hystrix命令超时超过一秒,一旦前十个事务失败,Hystrix会将命令短路,从而阻止对远程服务的任何请求,因此低响应时间。 关于为什么这些事务未显示为失败的原因,是因为此处存在一个后备,当失败时该后备会优雅地响应用户请求。

结论

这样做的目的是为了阐明为什么需要一个像Hystrix这样的库的动机,在此之后,我将详细介绍将Hystrix集成到应用程序中所需要的内容以及这个出色的库提供的功能的广度。

翻译自: https://www.javacodegeeks.com/2015/10/gentle-introduction-to-hystrix.html

hystrix熔断 简介

hystrix熔断 简介_Hystrix简介相关推荐

  1. hystrix熔断 简介_Hystrix简介– Hello World

    hystrix熔断 简介 在以前的博客文章中,我介绍了需要像Netflix Hystrix这样的库的动机. 在这里,我将跳入一些非常基本的方法来开始使用Hystrix,并在更复杂的用例中进行跟进. 你 ...

  2. hystrix熔断 简介_Hystrix简介–总结

    hystrix熔断 简介 这是其他两篇文章的后续文章– 动机 ,说明为什么在分布式系统中需要类似Hystrix的内容以及Hystrix的基本介绍 . 这将是我的Hystrix旅程的总结,其中包含各种属 ...

  3. DriverManager 驱动管理器类简介 JDBC简介(三)

    驱动程序管理器是负责管理驱动程序的,驱动注册以后,会保存在DriverManager中的已注册列表中 后续的处理就可以对这个列表进行操作 简言之,驱动管理器,就是字面含义,主要负责就是管理 驱动 概述 ...

  4. SpringCloud系列七:Hystrix 熔断机制(Hystrix基本配置、服务降级、HystrixDashboard服务监控、Turbine聚合监控)...

    声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.概念:Hystrix 熔断机制 2.具体内容 所谓的熔断机制和日常生活中见到电路保险丝是非常相似的,当出现了问题之后,保险丝 ...

  5. 【Android 高性能音频】Oboe 函数库简介 ( Oboe 简介 | Oboe 特点 | Oboe 编译工具 | Oboe 相关文档 | Oboe 测试工具 )

    文章目录 一.Oboe 简介 二.Oboe 特点 三.Oboe 编译工具 四.Oboe 文档 五.Oboe 测试 一.Oboe 简介 Oboe 简介 : ① 函数库 : Oboe 是 C++ 函数库 ...

  6. 【Android 应用开发】Paint 图形组合 Xfermod 简介 ( 图形组合集合描述 | Xfermod 简介 | PorterDuff 简介 )

    文章目录 图形组合 集合描述 Xfermod 简介 PorterDuff 由来 Xfermod 合成模式分类 图形组合 集合描述 图形组合 集合描述 : 1.下面我们先描述两个集合 : ① 集合 A ...

  7. Data Source与数据库连接池简介 JDBC简介(八)

    DataSource是作为DriverManager的替代品而推出的,DataSource 对象是获取连接的首选方法. 起源 为何放弃DriverManager DriverManager负责管理驱动 ...

  8. java 熔断机制_Hystrix Command执行以及熔断机制整理

    这几天在看Hystrix的一些实现,里面大量运用了rxjava的原理,将代码简化到了极致,对于有rxjava基础的同学,相信看懂Hystrix代码并不是一件难事.我这篇文章主要是针对Hystrix C ...

  9. 详解Hystrix熔断机制

    什么是hystrix的熔断? hystrix熔断主要是指在一定的时间窗口内,当请求的次数达到一定的失败比率后,hystrix就会主动拒绝服务,采取将请求直接降级等方式,从而有效的缓解了服务雪崩的问题, ...

最新文章

  1. 技术图文:如何利用C# + Echarts 绘制「堆叠条形图」?
  2. 如何用TF Object Detection API训练交通信号灯检测神经网络?
  3. R语言ggplot2可视化改变图中线条的透明度级别实战
  4. java基础---JVM---java内存区域与内存溢出问题
  5. java读取 png_如何让java的ImageBuffer正确读取PNG文件?
  6. 用Intel跟AMD CPU烤肉,哪个更香,你们猜猜结果?
  7. abp angular 和mvc_MVC - abp-angular - 博客园
  8. vs调试 右键 没有监视变量_IAR EWARM的SWO Trace调试功能
  9. Lucene系列-分析器
  10. GoDot引擎打包安卓
  11. win10系统怎么查看密钥?
  12. mysql the cabinet_mysql 一个较特殊的问题:You can’t specify target table ‘wms_cabinet_form’ | 很文博客...
  13. 推广TrustAI可信分析:通过提升数据质量来增强在ERNIE模型下性能
  14. 机房温度过高应这样预防
  15. 数字孪生是什么,数字孪生能干什么?一文读懂
  16. 分享一次自己使用 pyecharts 模块 画地图,一路踩坑和填坑的经历
  17. 反编译微信小程序错误: $gwx is not defined和__vd_version_info__ is not defined 已解决
  18. git commit -amend报错 ! [remote rejected] HEAD -> refs/for/master (duplicate request) error: failed to
  19. 使用eCharts实现中国地图的散点图
  20. 《焦元溥古典音乐入门指南》学习笔记————第一章 为什么我们还在听古典音乐?

热门文章

  1. P3870-[TJOI2009]开关【分块】
  2. codeforces1452 E. Two Editorials
  3. 芋道 Spring Boot 自动配置原理
  4. MySQL week()函数
  5. Oracle入门(十四.7)之良好的编程习惯
  6. epoll 浅析以及 nio 中的 Selector
  7. HashMap 和 HashTable 到底哪不同 ?
  8. 2017派卧底去阿里、京东、美团、滴滴带回来的面试题
  9. String中的compareTo()方法
  10. MySQL多对多创建表语句(防忘记)