8

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

原因之一,我不明白使用情况使用他们异步执行与他们反应执行。我能看到的唯一区别是异步执行始终是非阻塞的,而Reactive可以是阻塞或非阻塞。所以我想我真正的问题是:

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

回答

20

假设您已经将两个服务呼叫A和B作为HystrixCommand包装。您现在有三个选项:

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

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

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

我希望它有帮助。

+0

你可以解释一下属性maxQueueSize https://github.com/Netflix/Hystrix/wiki/Configuration#ThreadPool。我对doc的理解是,当你指定这个属性时,用于从调用线程切换到Hystrix线程池中的其中一个线程的队列将是maxQueueSize的大小?如果是这样,如果我指定这个值足够大,我是否应该收到RejectedExecutionException? – timpham 2016-11-21 06:57:51