Hystrix工作原理(一)

Flow Chart

下图显示了通过Hystrix向服务依赖项发出请求时发生的情况:

以下部分将更详细地解释此流程:

  1. Construct a HystrixCommand or HystrixObservableCommand Object
  2. Execute the Command
  3. Is the Response Cached?
  4. Is the Circuit Open?
  5. Is the Thread Pool/Queue/Semaphore Full?
  6. HystrixObservableCommand.construct() or HystrixCommand.run()
  7. Calculate Circuit Health
  8. Get the Fallback
  9. Return the Successful Response

1. Construct a HystrixCommand or HystrixObservableCommand Object

第一步是构造一个HystrixCommand或HystrixObservableCommand对象来表示您对依赖项的请求。传递构造函数在发出请求时需要的任何参数。

如果期望依赖项返回单个响应,则构造HystrixCommand对象。例如:

HystrixCommand command = new HystrixCommand(arg1, arg2);

 如果期望依赖项返回发出响应的Observable,则构造HystrixObservableCommand对象。例如:

HystrixObservableCommand command = new HystrixObservableCommand(arg1, arg2);

2. Execute the Command

通过使用Hystrix命令对象的以下四种方法之一,有四种方法可以执行命令(前两种方法仅适用于简单的HystrixCommand对象,不适用于HystrixObservableCommand):

  • execute() -  blocks,然后返回从依赖项收到的单个响应(或者在发生错误时抛出异常)
  • queue() - 返回一个Future,您可以使用它从依赖项中获取单个响应
  • observe() - 订阅表示来自依赖项的响应的Observable,并返回一个Observable,它复制该源Observableto
  • Observable() - 返回一个Observable,当您订阅它时,它将执行Hystrix命令并发出其响应
K             value   = command.execute();
Future<K>     fValue  = command.queue();
Observable<K> ohValue = command.observe();         //hot observable
Observable<K> ocValue = command.toObservable();    //cold observable

同步调用execute()调用queue()。get()。queue()依次调用toObservable()。toBlocking()。toFuture()。也就是说,最终每个HystrixCommand都支持Observable实现,甚至那些旨在返回单个简单值的命令。

3. Is the Response Cached?

如果为此命令启用了请求缓存,并且如果缓存中有对请求的响应,则此缓存响应将立即以Observable的形式返回。(请参阅下面的“请求缓存”。)

4. Is the Circuit Open?

当您执行命令时,Hystrix会检查断路器以查看电路是否打开。如果电路打开(或“跳闸”),则Hystrix将不执行命令,但会将流程路由到(8)获取后备。如果电路闭合,则流程进行到(5)以检查是否有可用于运行命令的容量。

5. Is the Thread Pool/Queue/Semaphore Full?

如果与该命令关联的线程池和队列(或信号量,如果未在线程中运行)已满,则Hystrix将不会执行该命令,但会立即将流路由到(8)获取后备。

6. HystrixObservableCommand.construct() or HystrixCommand.run()

在这里,Hystrix通过您为此目的编写的方法调用对依赖项的请求,其中一项如下:

  • HystrixCommand.run() - 返回单个响应或抛出异常
  • HystrixObservableCommand.construct() - 返回发出响应或发送onError通知的Observable

如果run()或construct()方法超出命令的超时值,则线程将抛出TimeoutException(如果命令本身未在其自己的线程中运行,则将抛出单独的计时器线程)。在这种情况下,Hystrix将响应路由到8.获取回退,如果该方法不取消/中断,它将丢弃最终返回值run()或construct()方法。

请注意,没有办法强制潜在的线程停止工作 - 最好的Hystrix可以在JVM上做的就是抛出InterruptedException。如果由Hystrix包装的工作不遵守InterruptedExceptions,则Hystrix线程池中的线程将继续其工作,尽管客户端已经收到TimeoutException。这种行为可以使Hystrix线程池饱和,尽管负载“正确脱落”。大多数Java HTTP客户端库不解释InterruptedExceptions。因此,请确保在HTTP客户端上正确配置连接和读/写超时。

如果该命令没有抛出任何异常并且它返回了响应,则Hystrix在执行一些日志记录和度量报告后返回此响应。在run()的情况下,Hystrix返回一个Observable,它发出单个响应,然后发出onCompleted通知;在construct()的情况下,Hystrix返回由construct()返回的相同Observable。

7. Calculate Circuit Health

Hystrix报告断路器的成功,失败,拒绝和超时,它维护着一组计算统计数据的计数器。

它使用这些统计数据来确定电路何时“跳闸”,此时它会使任何后续请求短路,直到恢复周期结束,然后在首次检查某些健康检查后再次关闭电路。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hystrix是Netflix开源的一个库,主要用于处理分布式系统中的服务降级、熔断、限流等问题。它通过提供一个容错框架,可以帮助开发人员在分布式环境中更好地管理和控制服务之间的依赖关系,从而提高系统的稳定性和可用性。 Hystrix工作原理可以简单概括为以下几个步骤: 1. 定义服务依赖:开发人员需要在代码中定义需要依赖的服务,包括服务的URL、参数、超时时间等信息。 2. 封装服务调用:Hystrix会将每个服务调用封装成一个HystrixCommand对象,这个对象包含了服务调用的所有信息,同时也包含了一些容错相关的配置信息。 3. 监控服务调用:Hystrix会对所有服务调用进行监控,包括成功、失败、超时、熔断等情况。如果服务调用失败或超时,Hystrix会立即进行容错处理,例如返回一个默认值或者调用备用服务等。 4. 熔断机制:Hystrix还提供了熔断机制,当某个服务的错误率超过一定阈值时,Hystrix会自动断开对这个服务的调用,从而避免对整个系统产生过大的影响。 5. 配置管理:开发人员可以通过配置文件或者代码的方式对Hystrix进行配置,包括容错策略、超时时间、熔断阈值等。这些配置可以根据实际情况进行调整,从而优化系统的性能和稳定性。 总之,Hystrix通过提供一个可靠的容错框架,帮助开发人员在分布式环境中更好地管理和控制服务之间的依赖关系,从而提高系统的可用性和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值