Hystrix 执行模式

Posted

技术标签:

【中文标题】Hystrix 执行模式【英文标题】:Hystrix Execution Patterns 【发布时间】:2015-01-19 20:56:53 【问题描述】:

我正试图围绕Hystrix 转转,在阅读了他们的文档后,仍然对其使用模式有疑问。

一方面,我不了解 何时 使用他们的 异步 执行与他们的 Reactive用例 /strong> 执行。我能看到的唯一区别是异步执行始终是非阻塞的,而 Reactive 既可以是阻塞的,也可以是非阻塞的。所以我想我真正的问题是:

同步执行和阻塞响应执行有什么区别?和 异步和非阻塞响应式执行有什么区别?

【问题讨论】:

【参考方案1】:

假设您已将两个服务调用 A 和 B 包装为 HystrixCommand。您现在有三个选择:

使用.execute():纯同步调用。一旦结果到达,您调用该方法并继续您的程序。您的程序的总执行时间是两个调用的总和。您的程序的主要流程是非常线性的。

使用.queue():立即为这两个命令接收Future。两个服务调用并行执行。然后使用.get() 检索结果。这些调用与阻塞,直到结果在那里。您的总执行时间比以前更快:您的执行时间将是最长服务调用的长度。当您想要合并两个服务的结果时使用它。尽管两个调用是并行执行的,但程序的主要流程仍然是线性的。

使用.subscribe():立即为这两个命令接收Observable。两个服务调用并行执行。然后使用.subscribe() 注册一个回调,以便在结果可用时对其进行操作。如果您不想合并结果并希望在服务 A 和 B 的结果到达后独立地做出反应,这将非常有用。 您的程序的主要流程不是线性的,而是反应式的:程序流程将在每个命令的回调内继续。

希望对你有帮助。

【讨论】:

你能解释一下属性 maxQueueSize github.com/Netflix/Hystrix/wiki/Configuration#ThreadPool。我对文档的理解是,当您指定此属性时,用于从调用线程切换到 Hystrix 线程池中的线程之一的队列将是 maxQueueSize 的大小?如果是这样,如果我指定这个值足够大,我应该收到 RejectedExecutionException 吗?

以上是关于Hystrix 执行模式的主要内容,如果未能解决你的问题,请参考以下文章

Hystrix系列之信号量、线程池

8-19 Hystrix隔离演示及差异讲解

Hystrix熔断原理

Hystrix熔断原理

Hystrix参数说明

详解Hystrix资源隔离