Hystrix高可用系统容错框架,资源隔离,熔断,限流

hystrix 作用

做资源隔离,限流,熔断,降级,运维监控.

直白说,hystrix一定程度上能保障了微服务架构系统服务的高可用性,避免了很多服务雪崩,系统彻底瘫痪的情况,提高了系统容错性

hystrix的几大基本功能

资源隔离: 防止某一服务,或者某一任务线程在故障的情况下耗尽所有资源。 例如订单服务调用商品服务,商品服务故障导致发给商品服务的请求得不到返回,订单服务的所有线程资源被商品服务耗光。

限流: 简单理解 高峰期10万QPS,限流阻挡了9万QPS进入不了系统,保护系统不被瞬间大量QPS打崩

熔断: 当服务的一些依赖挂掉(例如mysql,redis等) 每次请求都会报错,几次请求后根据断路器进行熔断,阻止请求继续访问依赖,直到依赖恢复

降级: 高峰期10万QPS,配合限流只限制1万能打进系统正常请求,其他9万请求做降级处理(返回个简单页面等)

运维监控: 对线上请求 监控 报警 优化

资源隔离具体场景

以一个电商商品服务系统为例

如果想查商品信息,客户端发送请求打过来落在Nginx上,先查Nginx本地缓存是否有想要的数据

如果没有向下请求缓存服务,缓存服务先找redis是否有

如果没有缓存服务请求商品服务,商品服务再查找DB。 找到商品信息返还给缓存服务,再更新redis,再更新Nginx本地缓存

同理查询库存信息 还是其他信息。

如果请求商品信息时 商品服务发生故障,打过来的请求会被阻塞住,就会导致缓存服务所有发给商品服务的请求线程都会被阻塞,导致缓存服务的资源被商品服务耗尽,没有线程再去请求其他服务

用hystrix的线程池做资源隔离,用线程池,固定请求商品服务的请求数量10,请求库存服务的线程10...限制请求每个服务的线程数,保证资源不会全被某个服务耗尽

除了线程池,hystrix还提供一种资源隔离技术-信号量

请求线程过来,线程池是自己内部创建新的线程来完成完成请求的调用,适用于请求去调用不同服务。

信号量不会创建新的线程,直接用请求来的这个线程来干活,限制了总的并发量,更为轻量。

hystrix底层原理

hystrix通过命令模式,将每个请求封装成一个Command,每个类型的Command对应一个线程池 (例如商品服务Command)

请求过来,为请求创建Command

如果Command开启了缓存(配置的一个参数) ,会先向requestCache查询调用服务的结果,如果有直接返回

每个Command执行完会上报自己的执行结果状态给熔断器Circuit breaker,成功,失败,超时,拒绝,熔断器会统计这些数据

如果一个Command执行报错或者超时会直接做fallback降级处理。

如果同一类型Command的线程池或信号量已经满了,再来的请求会直接做fallback降级

如果熔断器已经开启了,那么所有的请求都直接做降级处理

什么时候会开启熔断器Circuit breaker?

1.上报熔断器的Command请求数量短时间内达到阈值(例如1秒内达到100个),这是熔断器回去判断是否需要开启

2.统级所有上报的Command请求结果异常的数量是否达到一定比例(例如60%),达到预配置的比例会直接开启

开启熔断器后,熔断器由close状态 切换到 open状态,所有请求全部做fallback降级

经过一段时间后,会从open状态 切换到 half-open状态,试着让少量请求通过熔断器 试试能不能正常调用,再决定是否open 还是close

fallback降级一般的处理方式

降级返回默认值,给个友好提示  (对不起,系统开小差了呃..)

返回缓存里面的值,或者(例如从redis或者ehcache尽量取一些值,拼成一个结果返还给客户端)

不同的command执行方式,其fallback为空或者异常时的返回结果不同

执行command

执行Command就可以发起一次对依赖服务的调用

要执行Command,需要在4个方法中选择其中的一个:execute(),queue(),observe(),toObservable()

execute():调用后直接block住,属于同步调用,直到依赖服务返回单条结果,或者抛出异常
queue():返回一个Future,属于异步调用,后面可以通过Future获取单条结果
observe():订阅一个Observable对象,Observable代表的是依赖服务返回的结果,获取到一个那个代表结果的Observable对象的拷贝对象
toObservable():返回一个Observable对象,如果我们订阅这个对象,就会执行command并且获取返回结果

调用HystrixObservableCommand.construct()或HystrixCommand.run()来实际执行这个command

HystrixCommand.run()是返回一个单条结果,或者抛出一个异常
HystrixObservableCommand.construct()是返回一个Observable对象,可以获取多条结果

如果HystrixCommand.run()或HystrixObservableCommand.construct()的执行,超过了timeout时长的话,那么command所在的线程就会抛出一个TimeoutException

如果timeout了,也会去执行fallback降级机制,而且就不会管run()或construct()返回的值了

这里要注意的一点是,我们是不可能终止掉一个调用严重延迟的依赖服务的线程的,只能说给你抛出来一个TimeoutException,但是还是可能会因为严重延迟的调用线程占满整个线程池的

即使这个时候新来的流量都被限流了。。。

如果没有timeout的话,那么就会拿到一些调用依赖服务获取到的结果,然后hystrix会做一些logging记录和metric统计

来源:https://www.icode9.com/content-4-791601.html

(0)

相关推荐

  • Hystrix 配置参数全解析

    前言 不久前在部门周会上分享了 Hystrix 源码解析之后,就无奈地背上了专家包袱,同事们都认为我对 Hystrix 很熟,我们接触 Hystrix 更多的还是工作中的使用和配置,所以很多人一遇到 ...

  • 10张图带你彻底搞懂限流、熔断、服务降级

    在分布式系统中,如果某个服务节点发生故障或者网络发生异常,都有可能导致调用方被阻塞等待,如果超时时间设置很长,调用方资源很可能被耗尽.这又导致了调用方的上游系统发生资源耗尽的情况,最终导致系统雪崩. ...

  • SpringCloud-Hystrix组件使用

    https://github.com/Netflix/Hystrix 在分布式环境中,许多服务依赖项不可避免地会失败.Hystrix是一个库,它通过添加延迟容忍和容错逻辑来帮助您控制这些分布式服务之间 ...

  • Hystrix高级属性配置

    在几篇的讲解和操作中,我们已经知道了服务与服务之间是通过Hystrix来实现服务熔断与降级的,Hystrix官网上除了介绍Hystrix外,还列出了一些Hystrix高级属性配置. (https:// ...

  • Soul网关Hystrix插件相关知识点扫盲

    线程隔离和信号量隔离 Hystrix 里面核心的一项功能,其实就是所谓的资源隔离,要解决的最最核心的问题,就是将多个依赖服务的调用分别隔离到各自的资源池内.避免说对某一个依赖服务的调用,因为依赖服务的 ...

  • 稳定性保障6步走:高可用系统大促作战指南!

    一  前言 年年有大促,大家对于大促稳定性保障这个词都不陌生,业务场景尽管各不相同,"套路"往往殊路同归,全链路压测.容量评估.限流.紧急预案等,来来去去总少不了那么几板斧. 跳出 ...

  • 系统设计:关于高可用系统的一些技术方案

    系统设计:关于高可用系统的一些技术方案 可靠的系统是业务稳定.快速发展的基石.那么,如何做到系统高可靠.高可用呢?下面从技术方面介绍几种提高系统可靠性.可用性的方法.   扩展 扩展是最常见的提升系统 ...

  • java 全端开源 电商系统 springboot uniapp 小程序 前后端分离 高可用

    所有jar包均可从maven中央仓库下载,无二次封装jar包,全端开源,无后门,无监控. 介绍 官网:https://pickmall.cn Lilishop 是一款Java开发,基于SpringBo ...

  • 支付系统高可用架构设计实战,可用性高达99.999!

    作者:冯忠旗 juejin.im/post/5cfde01bf265da1bba58f863 一.背景 对于互联网应用和企业大型应用而言,多数都尽可能地要求做到7*24小时不间断运行,而要做到完全不间 ...

  • 创新区块链高可用模式 提升应用系统业务连续性

    作为新基建的新技术基础设施,区块链首次被纳入了"十四五规划",各地政府也陆续出台区块链发展规划与激励政策,区块链技术在政策的催化下进入黄金发展时期.区块链技术在供应链金融.物联网. ...

  • Docker下Ubuntu系统编译安装HAprox+Keepalived+MySQL负载高可用架构

    系统环境:Ubuntu16.04(Docker容器) 架构环境: Keepalived/HAproxy MASTER: 172.17.0.4 Keepalived/HAproxy BACKUP: 17 ...

  • 架构师系列:如何建设一个高可用的系统

    本文讨论 2 个主题:什么是高可用系统?如何建设? 高可用 什么是高可用系统 符合下述 2 个特征就是高可用系统 单位时间内,系统不可用的时间短 例如:一年内,系统不可用的时间不超过5分钟 若发生系统 ...

  • 应对618,京东到家订单系统高可用架构的迭代实战

    大家好,我是京东到家后台研发部的架构师闫文广,今天将给大家分享京东到家订单系统的高可用架构及演变过程. 京东到家是达达集团旗下中国最大的本地即时零售平台之一,目标就是实现一个小时配送到家的业务.一直到 ...

  • 心智,在系统思维框架之中,扮演啥角色呢?

    2020-05-20优质教育领域创作者 已关注 所属专栏:系统思维方法论! 无论谈什么思维,谈逆向思维,谈水平思维,谈以终为始的思维,谈创新思维,或者这个专栏所谈的系统思维,心智都是绕不开的一个存在, ...