2015-09-06 98 views
3

我有幾個數據庫IO操作,我想同時運行。在我的情況下,最好使用BalancingPool路由器。Akka BalancingPool使用PinnedDispatcher

該文檔說,如果在工作中發生阻塞操作,那麼應該使用線程池執行程序而不是默認的fork-join-dispatcher。

我不想配置它在阿卡的conf文件,所以我認爲這將是做在代碼的方式:

val router = context.actorOf(BalancingPool(5).withDispatcher("my-pinned-dispatcher").props(Props[History]), "HistoryBalancingRouter") 

但是文檔說的PinnedDispatcher:

這個調度程序爲每個使用它的actor使用一個唯一的線程; 即,每個演員將擁有自己的線程池,池中只有一個線程在 。

郵箱:任何,創建每個演員

而對於BalancingPool它說工人共享一個單一的郵箱之一:

BalancingPool自動使用一種特殊的BalancingDispatcher爲 其routees - 不管任何在路由器對象上設置的調度器。這是通過所有路由共享相同的郵箱來實現 平衡語義所必需的。

雖然不可能更改路由使用的調度程序,但是可以微調使用的執行程序。 默認情況下, fork-join-dispatcher用於,可以按照 Dispatchers中的說明進行配置。 在其中routees預計執行 阻塞操作可能是有益與 線程池執行人暗示分配線程 的明確

那麼什麼是真正與郵箱發生的數量來取代它的情況和線程在這裏?

我的例子是一個使用線程池執行器來實現BalancingPool的理想方法嗎?

回答

2

BalancingPool始終與BalancingDispatcher協同工作,它只會拒絕您的PinnedDispatcher設置。原因正是BalancingDispatcher允許參與者共享其他Dispatcher不支持的共同郵箱(用於性能)。

請注意,幾個調度程序允許您配置執行器,他們將在裏面使用。默認情況下,對於BalancingPool,它是fork-join-executor(文檔錯誤地稱爲「fork-join-dispatcher」),但您可以將其更改爲使用thread-pool-executor。調度器配置示例如下:http://doc.akka.io/docs/akka/2.3.13/scala/dispatchers.html#Setting_the_dispatcher_for_an_Actor您只需更改執行器類型