我正试图围绕Hystrix环绕我的头,在阅读他们的文档后,仍然对其使用模式有疑问。Hystrix执行模式
原因之一,我不明白使用情况为当使用他们异步执行与他们反应执行。我能看到的唯一区别是异步执行始终是非阻塞的,而Reactive可以是阻塞或非阻塞。所以我想我真正的问题是:
- 同步和阻塞反应式执行有什么区别?和
- 异步和非阻塞反应式执行有什么区别?
我正试图围绕Hystrix环绕我的头,在阅读他们的文档后,仍然对其使用模式有疑问。Hystrix执行模式
原因之一,我不明白使用情况为当使用他们异步执行与他们反应执行。我能看到的唯一区别是异步执行始终是非阻塞的,而Reactive可以是阻塞或非阻塞。所以我想我真正的问题是:
假设您已经将两个服务呼叫A和B作为HystrixCommand
包装。您现在有三个选项:
使用.execute()
:纯同步呼叫。您调用该方法并在结果到达后继续执行程序。您的程序的总执行时间是两个调用的总和。你的程序的主要流程是非常线性的。
使用.queue()
:立即为两个命令接收Future
。这两个服务调用都是并行执行的。然后使用.get()
来检索结果。这些调用阻塞,直到结果存在。您的总执行时间比以前更快:您的执行时间将是最长服务调用的时间长度。即使你想组合这两个服务的结果,也要使用它。尽管两个调用并行执行,但程序的主流仍然是线性的。
使用.subscribe()
:立即收到一个Observable
两个命令。这两个服务调用都是并行执行的。然后使用.subscribe()
来注册回叫,以便在结果可用时对结果采取行动。如果您不想合并结果并希望在服务A和B到达后独立对结果做出反应,这非常有用。 程序的主要流程不是线性的,而是反应性的:程序的流程将在每个命令的回调中继续。
我希望它有帮助。
你可以解释一下属性maxQueueSize https://github.com/Netflix/Hystrix/wiki/Configuration#ThreadPool。我对doc的理解是,当你指定这个属性时,用于从调用线程切换到Hystrix线程池中的其中一个线程的队列将是maxQueueSize的大小?如果是这样,如果我指定这个值足够大,我是否应该收到RejectedExecutionException? – timpham 2016-11-21 06:57:51