2017-04-04 68 views
0

我知道演員是持久的,只要沒有什麼可做的事情,他們就會一直處於閒置狀態(郵箱中沒有郵件),那麼誰來監控郵箱?誰監視每個Actor的郵箱?

它是演員本身嗎?但它沒有從調度程序分配的線程,直到它有消息。

或者,是否有任何後臺守護進程運行每個參與者的監視郵箱?

+1

行動者不堅持。但是你可以爲演員添加持久性。演員不會閒着(因爲他們不是實際的工作部分)。它只是它們沒有受到線程的影響。郵箱由調度員擁有。 –

+0

因此,調度員正在監控演員郵箱? – RBanerjee

+0

事實上,調度員擁有的郵箱在很大程度上是不準確的。但是,您在這裏「監控」是什麼意思? –

回答

1

作爲@Sarvesh庫馬爾辛格提到,演員並不是默認持久。您可以通過擴展PersistentActor來創建持久性actor:Akka Persistence。 事實上,當在actor系統層次結構中創建一個actor(cell)時,其郵箱(Mailbox是Runnable的子類)將被附加到調度器,當actor被啓動時,調度器將執行郵箱runnable(在run方法中定義)通過輪詢來自郵箱隊列的消息,如果有消息,它將觸發已定義的actor接收方法來實際處理消息。消息循環(在此運行期間,隊列中的消息將被處理爲批處理,如果處理這批批處理沒有通過調度程序吞吐量配置的限制)也是在run方法中通過遞歸調用processMailBox定義的在郵箱中。在每輪結束時,如果有消息演員郵箱被安排執行循環繼續,郵箱將自己附加到調度程序線程池以供執行。如果沒有,則循環被打破,當有消息發送給演員時,下一次運行將被安排,此時,當您調用actorRef時,消息將通過與演員單元連接的調度器分派。消息,這將使調度員安排消息處理,檢查了這一點:Dispatch::sendMessageDispatcher::dispatch。如Dispatchers中所述,調度程序的吞吐量可以配置爲確定在線程跳轉到下一個actor之前每個actor需要處理的最大消息數。

+0

好的,現在假設沒有消息並且有1000個演員。因此調度員只是忙於輪詢1000個郵箱。 ?是嗎 ? – RBanerjee

+0

不,因爲當演員中沒有消息時,演員跑步方法將不會再被安排。沒有runnable將排隊到調度程序線程池中。下一條消息發送給演員將通過附屬於該演員單元的調度員發送,此時調度員將安排演員消息處理的執行。我將編輯答案以使其更清楚。 –

+1

因此,實際上,調度員不是「監視」郵箱,在實現Akka actor時,它實際上是將消息發送給actor的後端入口點。 –