2016-06-01 16 views
5

我的流具有CPU綁定和IO綁定階段(每個IO階段後跟一個CPU階段)的混合。我想要做的是將IO操作放在與流的其餘部分不同的調度器上。Akka流 - 在不同的調度器上放置一個IO綁定流

在一個傳統的基於Actor的Akka應用程序中,我可以將我的IO參與者放在一個固定的線程池調度程序中,並使用大量的線程,同時將CPU綁定的參與者放在具有少量線程的fork連接池中(一些多線程,理想情況下爲1個核心數量)。這應該減少CPU綁定參與者在線程切換時浪費的時間,同時通過在IO上阻塞很多線程來增加吞吐量。

這種理解對嗎?如果不是,爲什麼?如果是的話,那麼我怎樣才能將IO綁定階段(流)放在一個單獨的調度器上與其餘的流?

我試過關閉自動熔斷,這確實有幫助。但它的吞吐量仍然遠低於幾乎相當於Akka的吞吐量。

回答

8

默認值是在流動的各個階段是在同一個演員跑,你可以標記階段應該在一個單獨的調度使用屬性運行,像這樣:

stage.withAttributes(ActorAttributes.dispatcher("dispatcher-name")) 

這也將引入異步邊界在那個舞臺上,在自己的演員中有效地運行它。爲避免異步邊界變得昂貴,階段現在實際上會從上游一次發送16個元素的需求,所以這是您必須注意的事情。

緩衝區大小可以使用一個額外的屬性進行調整,在這種情況下,使其具有像融合階段一樣的要求,一次請求一個元素,請注意,這可能會帶來太多的開銷,具體取決於用例。

stage.withAttributes(Attributes.inputBuffer(1, 1)) 

的文檔的相關部分:

+0

感謝您的回答。這是我正在尋找的。 – anindyaju99

+0

如果我想返回響應並繼續在後臺工作,該怎麼辦? [這](https://gist.github.com/asarkar/37e4cb026c463f6334617e923cfc4b12)似乎工作。 –