2015-06-04 60 views
16

我想了解何時使用Akka Futures,發現this article比主Akka文檔更有幫助。因此,看起來Akka Futures與Java 7 Futures完全一樣。所以我問:Akka vs Java 7期貨

  • 在演員系統的環境之外,Akka期貨對Java期貨有什麼好處?何時使用每個?
  • 在演員系統的背景下,爲什麼曾使用使用Akka Future?不是所有的actor-to-actor消息都是異步的,併發的和非阻塞的嗎?
+0

Akka的'Future'和'Promise'與Java的'CompletableFuture'更具可比性。 –

+0

謝謝@SotiriosDelimanolis,但你可能不認爲它是這樣,但它確實如此。 – smeeb

回答

7

Akka Futures實現異步通信方式,而Java7 Futures實現同步方式。是的,他們做同樣的事情 - 溝通 - 但方式完全不同。

生產者 - 消費者對可以通過兩種方式進行交互:同步和異步。同步方式假定消費者具有其自己的線程並執行阻止操作以獲得下一個產生的消息,例如, BlockingQueue.take()。在異步方法中,消費者不擁有一個線程,它只是一個至少有兩種方法的對象:存儲消息並對其進行處理。生產者調用存儲方法,就像在同步方法中調用Queue.put(m)一樣,但此方法也啓動在公共線程池上執行消費者處理方法。

UPDT 至於第二個問題(爲什麼使用阿卡未來): 未來的創造看起來(而且)比演員的簡單;代理鏈條的代碼比演員的代碼更緊湊,更明顯。 但是請注意,Future只能傳遞一個值(消息),而Actor可以處理一系列消息。但是序列可以用Akka Streams來處理。所以問題就出現了:爲什麼要使用Akka Actors?我邀請更多有經驗的開發人員回答這個問題。一般來說,我認爲如果你的任務可以用Futures解決,那麼使用Futures,否則如果使用Streams,使用Streams,否則使用Akka Actors,然後使用Actor,否則尋找另一個框架。

+0

謝謝@Alexei Kaigorodov(+1) - 我認爲這解決了我首先關注的問題,關於在演員系統的上下文之外使用Akka Futures *。如果我理解你是正確的,那麼當你需要一個普通的Java 7 Future時,你應該使用它們,但是需要一個* asynchronous * producer/consumer交互。 **但是我的第二個擔憂呢?**在演員系統裏面使用Akka Futures *怎麼樣?如果演員對演員的信息已經是異步的,爲什麼在演員系統中使用Akka Future呢?你會在與外部/阻塞數據庫進行通信的actor中使用它們嗎?再次感謝! – smeeb

+0

什麼使Java 7期貨比Akka期貨更爲同步呢?我不明白。 – flup

4

對於您的問題的第一部分,我同意Alexei Kaigorodov的回答。

對於你的問題的第二部分:

當演員的反應需要在一個非常特殊的方式來組合這是使用Future內部有用。例如,假設Master參與者需要執行多個阻塞數據庫查詢,然後彙總其結果,因此Master會將每個查詢發送到Worker,然後將聚合響應。如果查詢結果可以按任何順序彙總(例如Master只是計算行數或其他),那麼Worker通過回調將結果發送到Master是有意義的。但是,如果結果需要按照特定的順序進行組合,那麼每個Worker立即返回FutureMaster以便按照正確的順序操作這些Futures更容易。這也可以通過回調來完成,但是然後Master需要找出哪個查詢結果是將它們按正確的順序放入哪個查詢結果中,並且要優化代碼將是困難得多的。如果查詢1的結果可以立即與查詢2的結果彙總,那麼通過使用Future,該邏輯可以直接進入所有查詢的標識已知的調度代碼,而使用回調則需要Master來標識查詢結果並確定它是否可以將查詢與已返回的任何其他查詢結果進行聚合)。