背景

最近接手了一个系统,其功能都是查询。查询分了两种方式,一种是公司集团提供的查询能力,支持全国各个省份的查询,但是业务高峰期时服务响应比较慢;另外一种是各省的分公司都分别提供了对应的查询能力,但是服务质量相对较差,业务高峰期服务超时较多,而且分公司系统升级时也会影响服务质量。为了提升服务查询的成功率,可以将两种查询方式结合起来。比较完备方案就是优先使用各省分公司提供的服务,当分公司的服务质量下降后降级到公司集团对应的服务。很早就听过Hystrix,用在现用系统服务质量提升的改造上,再适合不过了。

Hystrix简介

Hystrix是Netflix开源的一款容错系统, 能帮助开发者码出具备强大的容错能力和鲁棒性的程序!

Hystrix功能

1、对依赖的服务(HTTP调用、SOA服务)进行保护, 并且把控住由于依赖服务所带来的的延迟和失败。

2、防止在一个复杂的分布式系统里出现级联失效(cascading failures)。

3、快速失败(Fail fast),并且快速恢复依赖服务。

4、优雅的降级。

5、实时的监控和报警。

健康状态系统

请求被阻塞系统

任何的RPC都可能会面临三种情况:成功、失败、超时。如果一次用户请求所依赖外部服务(A,H,I,P)有任何一个不可用,就有可能导致整个用户请求被阻塞。考虑到应用容器的线程数目基本都是固定的,当在高并发的情况下,某一外部依赖的服务超时阻塞,就有可能使得整个主线程池被占满 线程池被占满就会导致整个服务不可用,而依赖该服务的其他服务,就又可能会重复产生上述问题。因此整个系统就像雪崩一样逐渐的扩散、坍塌、崩溃了!

舱壁隔离模式(Bulkheads)

货船为了进行防止漏水和火灾的扩散, 将船的底部划分成一个个的舱室, 这样一个舱室进水不会导致整艘船沉没。

服务雪崩

隔离架构

降级-触发fallback

1、run()/construct方法抛出非HystrixBadRequestException异常

2、run()/construct()运行超时

3、熔断器启动

4、线程池/信号量拒绝

隔离策略

线程池隔离:会带来线程开销

Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("ThreadPoolTestGroup"))
.andCommandKey(HystrixCommandKey.Factory.asKey(“testCommandKey"))
//与其他命名的线程池天然隔离
.andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("ThreadPoolTest"))

信号量隔离:服务的并发数大于信号量阈值时将进入fallback 采用资源计数法,TryableSemaphore

.andCommandPropertiesDefaults(  // 配置信号量隔离
HystrixCommandProperties.Setter()
.withExecutionIsolationStrategy(ExecutionIsolationStrategy.SEMAPHORE)
.withExecutionIsolationSemaphoreMaxConcurrentRequests(3)
// fallback(降级)调用最大的并发数
.withFallbackIsolationSemaphoreMaxConcurrentRequests(10))

熔断器

熔断相当于家里电压过大电路的跳闸功能, 跳闸可以保护我们的电器, 在代码中类比就是将调用的服务直接给屏蔽了, 不再调用调用远程服务器的服务 举个栗子,配置熔断策略为 当请求错误比例在5s内>50%时, 该服务将进入熔断状态。

熔断器默认工作时间,默认:5秒, 熔断器中断请求5秒后会进入半打开状态, 放部分流量过去重试。

熔断器的开关能保证服务调用者在 调用异常服务时, 快速返回结果, fail fast or fallback static,避免大量的同步等待 并且熔断器能在一段时间后 继续侦测请求执行结果, 提供恢复服务调用的可能。

请求结果cache

将一个请求结果缓存起来, 下一个具有相同key的请求 将直接从缓存中取出结果,减少请求开销。

Hystrix设计点

  • 资源隔离
  • 熔断器模式
  • 命令模式
  • 观察者模式
  • RxJava

自助服务系统查询改造方案

命令调用模式,省端直连接口;降级调用模式,集团电商接口。

自助服务整合Hystrix后系统请求流程图。

参考链接

http://www.jianshu.com/p/b9af028efebb

https://github.com/Netflix/Hystrix/wiki

https://github.com/Netflix/Hystrix/wiki/How-To-Use

https://segmentfault.com/a/1190000005988895

http://kriszhang.com/hystrix_defend_your_webapp

https://blog.51cto.com/snowtiger/2057092

【赶快收藏】Hystrix实战,优雅提升系统的鲁棒性的更多相关文章

  1. SpringCloud---熔断降级理解、Hystrix实战(五)

    SpringCloud---熔断降级理解.Hystrix实战(五) https://www.cnblogs.com/qdhxhz/p/9581440.html https://blog.csdn.ne ...

  2. SpringCloud(6)---熔断降级理解、Hystrix实战

    SpringCloud(6)---熔断降级理解.Hystrix实战 一.概念 1.为什么需要熔断降级 (1)需求背景 它是系统负载过高,突发流量或者网络等各种异常情况介绍,常用的解决方案. 在一个分布 ...

  3. Hystrix 实战经验分享

    一.背景 Hystrix是Netlifx开源的一款容错框架,防雪崩利器,具备服务降级,服务熔断,依赖隔离,监控(Hystrix Dashboard)等功能. 尽管说Hystrix官方已不再维护,且有A ...

  4. 【精编重制版】JavaWeb 入门级项目实战 -- 文章发布系统 (第二节)

    说明 本教程是,原文章发布系统教程的精编重制版,会包含每一节的源码,以及修正之前的一些错误.因为之前的教程只做到了评论模块,很多地方还不完美,因此重制版会修复之前的一些谬误和阐述不清的地方,而且,后期 ...

  5. 赶快收藏!16款最流行的 JavaScript 框架

    下面为大家介绍 16款最流行的 JavaScript 框架,赶快收藏! 1. jQuery – Javascript框架 jQuery 是最流行的 JavaScript 框架,它简化了HTML 文档遍 ...

  6. Spark实战电影点评系统(二)

    二.通过DataFrame实战电影点评系统 DataFrameAPI是从Spark 1.3开始就有的,它是一种以RDD为基础的分布式无类型数据集,它的出现大幅度降低了普通Spark用户的学习门槛. D ...

  7. Spark实战电影点评系统(一)

    一.通过RDD实战电影点评系统 日常的数据来源有很多渠道,如网络爬虫.网页埋点.系统日志等.下面的案例中使用的是用户观看电影和点评电影的行为数据,数据来源于网络上的公开数据,共有3个数据文件:uers ...

  8. 【Linux SELinux】提升系统安全(一)

    本文重点:了解SELinux并能够熟练地启动关闭selinux(就像精通windows系统开关机一样) 背景:在centos5.x之后,selinux 非常完备地成为了系统内核模块,centos5.x ...

  9. 提升系统的QPS和吞吐量

    简单而言通过增加集群来提升qps和吞吐量 实际上要比这个要复杂 首先我们需要知道系统的瓶颈 我们所知道的系统拓扑架构 对于rest接口而言 系统设施依次是: dns nginx tomcat db/s ...

随机推荐

  1. 解决MobaXterm-SSH中文乱码问题

    一般情况不用修改服务器字符集(linux或unix服务器字符集一般不会设置错误). 1.首先用命令查看当前系统的LANG是什么: >locale LANG=en_US LC_COLLATE=&q ...

  2. Code signing is required for product type 'Unit Test Bundle' in SDK 'iOS 11.0.1'

    Code signing is required for product type 'Unit Test Bundle' in SDK 'iOS 11.0.1' 进入 projects and lis ...

  3. aabccd统计每个字符出现的次数,结果显示{ a: 2, b: 1, c: 2, d: 1 };去掉重复的字符,使结果显示abcd

    遍历字符串的方式和遍历数组的方式有点相似,或者说就是相同的.在学习数组的遍历方法之前,可以通过for循环去遍历数组,同样,字符串也可以:字符串跟数组都有一个length的属性.下面代码奉上,个人思路! ...

  4. Django之ORM-model模型关系

    模型类关系 1)一对多关系例:图书类-英雄类 models.ForeignKey() 定义在多的类中. 2)多对多关系例:新闻类-新闻类型类 体育新闻 国际新闻models.ManyToManyFie ...

  5. CentOS7配置网络ip地址

    CentOS7配置网络ip地址 CentOS 7.x版本中没有ifcfg-eth0文件 只有ifcfg-ens33文件(为了符合日常习惯) (1)将文件ifcfg-ens33重命名为ifcfg-eth ...

  6. Java 操作Word书签(二):添加文本、图片、表格到书签内容

    在Java操作Word书签(一)中介绍了给Word中的特定段落或文字添加书签.读取及删除已有书签的方法,本文将继续介绍Java 操作Word书签的方法,即如何给已有的书签添加内容,包括添加文本.图片. ...

  7. YARN底层基础库

      YARN基础库是其他一切模块的基础,它的设计直接决定了YARN的稳定性和扩展性,YARN借用了MRV1的一些底层基础库,比如RPC库等,但因为引入了很多新的软件设计方式,所以它的基础库更多,包括直 ...

  8. 11 python与redis交互

    安装:pip install redis 导入模块:from redis import * 创建StrictRedis 通过init创建对象,指定参数host.port与指定的服务器和端口连接. ho ...

  9. 从SpringBoot构建十万博文聊聊限流特技

    前言 在开发十万博客系统的的过程中,前面主要分享了爬虫.缓存穿透以及文章阅读量计数等等.爬虫的目的就是解决十万+问题:缓存穿透是为了保护后端数据库查询服务:计数服务解决了接近真实阅读数以及数据库服务的 ...

  10. GO.Web服务

    Web基础 Web服务器的一般工作原理可以简单地归纳为: 客户机浏览器通过TCP/IP协议建立到服务器的TCP连接 客户端向服务器发送HTTP协议请求包,请求服务器里的资源文档 服务器向客户机发送HT ...