我很難理解dispatchers in Akka 2的差異和建議用法。我想我知道如何BalancingDispatcher和CallingThreadDispatcher的行爲,但我不知道Dispatcher和PinnedDispatcher。阿卡2調度員的差異和使用模式是什麼?
我不明白Sharability
和Bulkheading
的概念。
我很難理解dispatchers in Akka 2的差異和建議用法。我想我知道如何BalancingDispatcher和CallingThreadDispatcher的行爲,但我不知道Dispatcher和PinnedDispatcher。阿卡2調度員的差異和使用模式是什麼?
我不明白Sharability
和Bulkheading
的概念。
我相信Shaabil是指可以共享特定類型的調度程序的參與者的數量/類型。我不確定是否有散播,但我會假定它是指某種演員分區,您只需要一個演員「擁有」一個主題。
以下是各種調度程序類型的代碼/ scaladoc註釋的說明。如果需要更多的疑問,請描述一下不清:
接線員:
基於事件的Dispatcher
結合一組行動者由BlockingQueue
備份的線程池。
BalancingDispatcher:
執行人基於事件驅動的調度員將嘗試從繁忙的演員重新分配工作空閒演員。假定所有使用該調度程序實例的actor可以處理已發送給其中一個actor的所有消息。即演員屬於一羣演員,而對於客戶來說,並不能保證哪個演員實例實際處理給定的消息。
雖然這個實現中使用的技術通常被稱爲「偷工減料」,但實際的實現可能被最好地描述爲「工作捐贈」,因爲哪個工作被盜的主角是主動的。
PinnedDispatcher:
致力於爲傳遞作爲參考每個演員的唯一線索。通過它的messageQueue服務。
CallingThreadDispatcher(在akka.testkit):僅運行在當前線程上調用
分派器。該調度程序不會創建任何新線程,但可以同時爲不同的線程使用同一個actor。調度策略是在當前線程上運行,除非目標actor在當前線程上被掛起或正在運行(如果它運行在不同的線程上,那麼該線程將阻塞,直到該另一個調用完成);如果調用未運行,則它將排隊在線程本地隊列中,以便在調用堆棧進一步上一次的主動調用完成後執行。如果僅使用一個線程,則會導致完全確定性的執行順序。
掛起和恢復是一個參與者的全局行爲,這意味着他們可以影響不同的線程,這會導致併發症。如果消息在暫停期間排隊(線程本地),則繼續運行它們的唯一線程是實際調用resume方法的線程。因此,當前沒有被排空的所有線程本地隊列(可能,因爲suspend-queue-resume可能完全在不同線程上調用期間發生)被抽取到當前線程局部隊列中,然後執行。可以暫停其調用堆棧中的actor。
分派器是默認實現。
PinnedDispatcher每個actor有一個線程,因此這些線程被固定到他們的actor上。
可分性意味着如果多個參與者想要使用相同的分派器實例,那麼應用什麼限制。
Bulkheading意味着彼此隔離部分 - according to Wikipedia。