當前位置:
首頁 > 最新 > Akka 使用系列之四:Future

Akka 使用系列之四:Future

這篇文章介紹 Akka 的同步機制,以及 Spark 和 Akka 的恩怨情仇。

1 Akka 中的 Future

Akka 中的 Actor 發送和接收消息默認都是非同步的。為了說明非同步性,我們實行下面的數學老師和歷史老師的 Actor:

class MathTeacherActor extends Actor with ActorLogging { def receive = { case "1+1等於多少?" => { Thread.sleep(1) sender ! "1+1等於2" } } } class HistoryTeacherActor extends Actor with ActorLogging { def receive = { case "歷史上規模最大的眾籌行動是什麼?" => { Thread.sleep(1) sender ! "歷史上規模最大的眾籌行動是 +1s" } } }

如果我們在詢問歷史老師之後訪問答案(如下面代碼所示),我們發現並不能獲取正確答案。原因就在於 Akka 是非同步非阻塞的。

val res = historyteacher ? "歷史上規模最大的眾籌行動是什麼?" println(res)

實質上, historyteacher ? "歷史上規模最大的眾籌行動是什麼?" 返回的根本不是答案,而是一個 Future。在Akka中, 一個Future是用來獲取某個並發操作的結果的數據結構。有了 Future,我們可以以同步(阻塞)或非同步(非阻塞)的方式訪問結果。下面是簡單地以同步(阻塞)方式訪問結果的示例。

class StudentActor(mathteacher:ActorRef,historyteacher:ActorRef) extends Actor with ActorLogging{ def receive = { case res:String => { val future1 = historyteacher ? "歷史上規模最大的眾籌行動是什麼?" val future2 = mathteacher ? "1+1等於多少?" val res1 = Await.result(future1,10 second) val res2 = Await.result(future2,10 second) println(res1) println(res2) } } }2 Akka 和 Spark

Spark 一開始使用 Akka 作為內部通信部件。在 Spark 1.3 年代,為了解決大塊數據(如Shuffle)的傳輸問題,Spark引入了Netty通信框架。到了 Spark 1.6, Spark 可以配置使用 Akka 或者 Netty 了,這意味著 Netty 可以完全替代 Akka 了。再到 Spark 2, Spark 已經完全拋棄 Akka 了,全部使用 Netty 了。Sad。

為什麼 Spark 無情地有步驟有預謀地拋棄 Akka 呢?Spark 官方倒是給了一個說法:https://issues.apache.org/jira/browse/SPARK-5293。

A lot of Spark user applications are using (or want to use) Akka. Akka as a whole can contribute great architectural simplicity and uniformity. However, because Spark depends on Akka, it is not possible for users to rely on different versions, and we have received many requests in the past asking for help about this specific issue. For example, Spark Streaming might be used as the receiver of Akka messages - but our dependency on Akka requires the upstream Akka actors to also use the identical version of Akka.

Since our usage of Akka is limited (mainly for RPC and single-threaded event loop), we can replace it with alternative RPC implementations and a common event loop in Spark.

大意就是很多 Spark 用戶在使用 Spark 之後,就必須使用 Spark 依賴的那個版本的 Akka。Spark 主要用了 Akka 的 RPC 和 單線程 event-loop,因此 Spark 沒有必要依賴完全的 Akka。最終 Spark 用 netty 實現下簡易版本的 Akka。真愛啊。

3 總結

到這裡,Akka 使用系列就結束了。這個系列簡單地過了一下 Akka 的基礎知識,介紹其梗概。如果需要深入了解,還需要詳細閱讀官方文檔。完整代碼已經上傳至Github。

最近在 GitHub 上開發了一個 Side Project -RoomAI。這個 Side Project 目標是提供一些非完整信息遊戲環境,讓演算法人員開發非完整信息遊戲 AI, 目前已經支持德州和梭哈。歡迎大家使用和反饋。我後續會基於這個項目寫一些文章介紹非完整信息遊戲的演算法。

Akka 系列系列文

Akka 使用系列之一: 快速入門

Akka 使用系列之二: 測試

Akka 使用系列之三: 層次結構和容錯機制

Akka 使用系列之四: Future

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 推酷 的精彩文章:

從西北市場切入,「鋼源城」聚焦上下游供應鏈服務能力
MVP的初步認識
Google Assistant 簡史,語音助手已是谷歌一個人的賽跑
為什麼你不應該再使用『var』 –Hacker Noon
為什麼你必須摒棄 Java,全面轉向 Kotlin 語言?

TAG:推酷 |

您可能感興趣

100 Posters Hakka Impression 客家印象海報邀請展
Hakan AKKAYA 2018春夏時裝發布會
樹莓派3+Lakka遊戲系統使用體驗「農步祥」
潮美食 | 這些顏值在線的粵式點心,就算是最挑剔的味蕾也能征服——Hakkasan
分散式編程-Akka介紹與應用
拯救你家的丑花盆,打造治癒系Zakka風
63㎡最野改法,兩居變一居,北京90後小夫妻將家裝成Zakka混搭風
武漢小夫妻53㎡日式Zakka風的家,開放式客餐廚寬敞又明亮!
明治巧克力也推出跨界Zakka雜貨,還很有設計感呢!
日式zakka風家居,構建出了這個溫馨又時尚的小家
簡單三步,打造文青最愛ZAKKA風家居