背景

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

    all  ( )                                 循环参数,参数全为真就返回Ture  any()                              只要有一个 ...

  2. JD面试 || 移除教室人数

    在昨天参加了东哥的笔试,选择题做的还算可以,但是还有道编程题和关于jdk8的Stream特性难住了.鉴于此用博客总结一下这道编程题,并结合Stream特性来简化代码,熟悉Api. 题目描述 某校在积极 ...

  3. 电话面试总结(问的很细).md

    String 和其他基本类型有什么区别 Tip 基本类型有几种 为什么要给String创建一个常量池而不给其他类创建常量池 常量池的定义是什么 垃圾回收机制是如何运行的 对新生代和老年代不同的处理机制 ...

  4. 9043Markdown常用用法

    1.标题 1.1 方法一:==和--标记 =和-标记语法格式如下: 我是标题一 == 我是标题二 -- 组成: 1标题文字:我是标题一 2回车换行 3标记:== (为一级标题)--(为二级标题) 效果 ...

  5. Web前端和Web后端的区分

    版权声明:本文为CSDN博主「十豆三展」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/zz1399590022 ...

  6. python学习——文件操作

    打开文件 f = open(文件名, 文件打开模式,文件编码) ‘w’:只写模式,它是只能写,而不能读的.如果用’w’模式打开一个不存在的文件,则会创建新的文件开始写入:如果用’w’模式打开一个已存在 ...

  7. 01_liteide 集成环境运行的问题

    //go语言是以包为管理单位 //每个文件必须先声明包 //程序必须有一个main包 package main import (  "fmt" ) //入口函数 func main ...

  8. GIS基础知识 - 坐标系、投影、EPSG:4326、EPSG:3857

    最近接手一个GIS项目,需要用到 PostGIS,GeoServer,OpenLayers 等工具组件,遇到一堆地理信息相关的术语名词,在这里做一个总结. 1. 大地测量学 (Geodesy) 大地测 ...

  9. 洛谷P1582 倒水 二进制 lowbit __builtin_popcount

    P1582 倒水:https://www.luogu.org/problemnew/show/P1582 题意: 给定n瓶装有1升的水瓶,每次可以把两瓶装水量相同的水和成一瓶,问最少还要增加几瓶装有1 ...

  10. Codeforces Round #503 (by SIS, Div. 2) D. The hat -交互题,二分

    cf1020D 题意: 交互题目,在有限的询问中找到一个x,使得数列中的第x位和第(x+n/2)位的值大小相同.数列保证相邻的两个差值为1或-1: 思路: 构造函数f(x) = a[x] - a[x ...