2014-06-26 28 views
1

我是新來的stackoverflow,我一直試圖圍繞「Akka Actor」和這個異步通信的工作原理。所以基本上,我的web應用程序將(可能)有數以千計的用戶與它進行通信,請求並編寫我擁有的數據庫。基本的持久性網絡應用程序...瞭解Akka Actor和異步IO的好處

所以基本上,我已經聽過很多次了,Async IO是構建這種解決方案的方式,當然Akka是一個去處。我的問題確實是,

如果一個Akka演員一次只能處理一條消息,那麼這裏的整體優勢究竟是什麼,我是否缺少了一些東西,Akka.ActorSystem會根據線程數量自動創建和銷燬參與者在電腦裏?最重要的是,如果某些客戶端有比較完善的數據庫任務,那麼基本上會阻止這些參與者,直到它能夠發送正確的響應爲止。這是否是期貨進來,我沒有真正理解期貨是什麼。如果你不得不調用future.get()(這是一個阻塞操作)到底有什麼意義?

我目前正在使用Scalatra 2.3,這有點令人討厭,因爲他們的所有教程都說Akka內置,同時他們在Scalatra 2.3中刪除它,贊成scala.concurrent,根據Scala 2.11.x發佈說明,演員已被刪除贊成Akka。所有這一切都僅僅是自相矛盾,我發現自己越來越困惑於使用什麼,如何使用它,它做了什麼,有什麼優勢等等。如果有人可以請幫助澄清這些問題,我很樂意聽到並學習。非常感謝!

回答

1

是的,你是對的,演員可以一次處理一條信息,但是你可以用幾種方法來優化它,我會試着解釋一下。 如果一個參與者正在忙於處理消息,則所有傳入的消息將排隊在一個緩衝區中。但是如果消息的速率太高,那麼消息最終會趨於下降。您可以將郵箱用於此目的以避免發生這種情況,並將您的任務分配給多個參與者以避免擁塞。 This link將爲您提供有關郵箱的更多信息。

關於創建演員,您可以設計您的系統,以便爲您想要執行的每項任務生成演員,並在該任務完成時演員可以向自己發送殺手信號,或者主演員可以告訴演員要自殺。對於這樣一個系統的例子,你可以view this,因爲它會爲你清除很多東西。

關於做演員異步工作而不會阻塞你可以做到這一點使用期貨,利用巧妙的技巧是這樣一個例子:

def myFuncInActor(num1: Int,num2: Int): Unit = { 
    Future { // actor doing a task asynchronously 
     val sum = num1 + num2 
     val avg = sum/2 
     // anything you want to do here 
     myCaseClass(avg) 
    } pipeTo self // actor sending the result to itself 
    } 

那麼,如果你不滿足於用阿卡演員,你也可以做這使用zeroMQ。我認爲你也應該接受它。我希望你發現這些信息很有幫助。

+0

哇這太棒了,非常感謝你的澄清,所以基本上BalancingDispatcher就是我一直在尋找的東西,更不用說自定義實現來產生工作者Actor,並讓他們從調度員那裏請求工作。好的竅門哈哈,有趣,所以未來的結果只會在獲得結果後才傳遞給自己?謝謝4aRk! – PranavSathy

+0

未來的結果可以傳送給任何演員。不一定對演員本身。未來,你甚至可能會向其他演員發送消息。 –