Hystrix的使用1

Stella981
• 阅读 681

Hystrix的使用1-简介

以下文章照搬自Hystrix官网介绍

1.什么是Hystrix?

在分布式环境中,不可避免地会有许多服务依赖项中的某些失败。Hystrix是一个库,可通过添加等待时间容限和容错逻辑来帮助您控制这些分布式服务之间的交互。Hystrix通过隔离服务之间的访问点,停止服务之间的级联故障并提供后备选项来实现此目的,所有这些都可以提高系统的整体弹性。

2.Hystrix的作用是什么?

Hystrix旨在执行以下操作:

  • 提供保护并控制通过第三方客户端库(通常是通过网络)访问的依赖项的延迟和失败。
  • 停止复杂的分布式系统中的级联故障。
  • 快速失败,迅速恢复。
  • 回退并在可能的情况下正常降级。
  • 启用近乎实时的监视,警报和操作控制。

3.Hystrix解决什么问题?

复杂的分布式体系结构中的应用程序具有数十个依赖项,每个依赖项都会不可避免地在某个时刻失败。如果主机应用程序未与这些外部故障隔离开来,则可能会被淘汰。
例如,对于依赖于30个服务的应用程序,其中每个服务的正常运行时间为99.99%,您可以期望:

99.9930 = 99.7% 正常运行时间
10亿个请求中就有0.3%的失败率,也就是300万的失败量。
即使每个微服务都按照期望工作,一个月也有2个小时以上的停机时间。

现实通常更糟。
即使所有依赖项都表现良好,如果不对整个系统进行弹性设计,即使 0.01% 的停机时间对每项服务都产生 0.01% 的停机时间,也相当于每月可能停机数小时。

4.请求示意

当一切正常时,请求流如下所示:
Hystrix的使用1
当其中一个服务宕机后,它会阻塞整个调用流程:
Hystrix的使用1
当流量变大,如果一个服务宕机,这可能导致所有服务器上的所有资源在几秒钟内变得饱和,从而导致整个系统出现更多级联故障。
Hystrix的使用1
当通过第三方客户端执行网络访问时,这些问题会更加严重。“第三方”是一个隐藏了实施细节的“黑匣子”,可以随时更改,并且每个客户端库的网络或资源配置都不同,通常难以监控和更改。
更糟糕的是,调用者不会明确知道调用的服务是否正常,从而导致调用阻塞。
导致服务阻塞的原因有:网络连接失败或降级、服务和服务器出现故障或变慢、新的库或服务部署会更改行为或性能特征、客户端库有错误。
所有这些都代表需要隔离和管理故障和延迟,以使单个故障服务不会导致整个系统宕机。

5.Hystrix的设计原则是什么?

Hystrix的工作原理:

  • 防止调用某个故障服务耗尽所有容器(例如Tomcat)用户线程。
  • 当服务出现故障时,快速返回用户可接受的信息,不会阻塞服务。
  • 在可行的情况下提供备用,以保护用户免受故障的影响。
  • 使用隔离技术(例如隔板,泳道和断路器模式)来限制任何一种依赖关系的影响。
  • 通过近实时指标,监视和警报优化发现时间
  • 通过在Hystrix的大多数方面中以低延迟传播配置更改来优化恢复时间,并支持动态属性更改,这使您可以通过低延迟反馈回路进行实时操作修改。
  • 防止整个依赖性客户端执行失败,而不仅仅是网络流量失败。

6.Hystrix如何实现其目标?

Hystrix通过以下方式做到这一点:

  • 将对外部系统(或“依赖关系”)的所有调用包装在HystrixCommand或HystrixObservableCommand对象中,使用单独的线程执行(命令模式)。
  • 可以配置调用超时配置,来防止服务超时卡死。
  • 为每个依赖项维护一个小的线程池(或信号灯);如果已满,发往该依赖项的请求将立即被拒绝。
  • 检测服务调用的情况,如成功,失败(客户端抛出的异常),超时和线程拒绝。
  • 如果某个服务的错误百分比超过阈值,则使熔断器跳闸,以在一段时间内手动或自动停止所有对特定服务的请求。
  • 当请求失败,被拒绝,超时或短路时执行服务降级措施。
  • 几乎实时监控指标和配置更改。 当您使用Hystrix封装需要调用的服务时,就会变成如下的结构。每个服务调用彼此隔离,在大流量时会执行服务限流,服务出现错误时会执行服务降级,如果调用失败次数过多就会执行服务熔断:
    Hystrix的使用1

7.转载原文

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这