Akka是用於在JVM上構建高並發、分布式和容錯事件驅動應用程序的工具包和運行時環境。 Akka可以與Java和Scala一起使用。本指南介紹了Akka,描述了Hello World示例的Scala版本。如果您更喜歡在Java中使用Akka,請切換到Java版的Akka快速入門。
Actor是Akka的執行單位。 Actor模型是一種抽象,可以更容易地編寫正確的並發,並行和分布式係統。 本文的Hello World示例介紹了Akka的基本知識。通過這個示例,在30分鍾內,您應該能夠下載並運行示例,並使用本指南了解示例的構建方式。
在嘗試這個例子後,綜合入門指南是繼續學習更多Akka隻是的不二選擇。
下載示例
Scala的Hello World示例是一個包含sbt(構建工具)分發的壓縮項目。您可以在Linux,MacOS或Windows上運行它。唯一的先決條件是Java 8。
下載並解壓縮示例:
- 從Lightbend Tech Hub通過點擊
CREATE A PROJECT FOR ME下載zip文件
。 - 將zip文件解壓縮到一個方便的位置:
- 在Linux和OSX係統上,打開一個終端並使用該命令
unzip akka-quickstart-scala.zip
。注意:在OSX上,如果使用Archiver解壓縮,則還必須使sbt文件可執行:$ chmod u+x ./sbt $ chmod u+x ./sbt-dist/bin/sbt
- 在Windows上,使用文件資源管理器等工具來提取項目。
運行示例
運行Hello World:
- 在控製台中,將目錄更改為解壓縮項目的頂層。例如,如果您使用默認項目名稱akka-quickstart-scala,並將該項目從根目錄提取到根目錄,請輸入:
cd akka-quickstart-scala
- 輸入
./sbt(
在OSX /Linux)或sbt.bat(
在Windows上)啟動sbt。sbt下載項目依賴關係。該>
提示表示sbt已經以交互模式啟動。 - 在sbt提示符處輸入
reStart
。sbt構建項目並運行Hello World
輸出應該看起來像這樣(一直向右滾動以查看Actor輸出):
[info] Compiling 1 Scala source and 1 Java source to /Users/x/akka-quickstart-scala/target/scala-2.12/classes...
[info] Running com.lightbend.akka.sample.AkkaQuickstart
[INFO] [05/09/2017 09:57:15.979] [helloAkka-akka.actor.default-dispatcher-2] [akka://helloAkka/user/printerActor] Greeting received (from Actor[akka://helloAkka/user/howdyGreeter#-1854995773]): Howdy, Akka
[INFO] [05/09/2017 09:57:15.980] [helloAkka-akka.actor.default-dispatcher-2] [akka://helloAkka/user/printerActor] Greeting received (from Actor[akka://helloAkka/user/helloGreeter#-1072877049]): Hello, Scala
[INFO] [05/09/2017 09:57:15.980] [helloAkka-akka.actor.default-dispatcher-2] [akka://helloAkka/user/printerActor] Greeting received (from Actor[akka://helloAkka/user/goodDayGreeter#1972065097]): Good day, Play
[INFO] [05/09/2017 09:57:15.980] [helloAkka-akka.actor.default-dispatcher-2] [akka://helloAkka/user/printerActor] Greeting received (from Actor[akka://helloAkka/user/howdyGreeter#-1854995773]): Howdy, Lightbend
恭喜,你剛剛跑了你的第一個Akka應用程序。現在看看到底發生了什麽。
Hello World做了什麽
正如您在控製台輸出中看到的那樣,該示例會輸出幾個問候語。我們來看看運行時會發生什麽。
首先,main類
創建一個akka.actor.ActorSystem
,Actor運行的一個容器。接下來,它創建3個Greeter Actor實例和1個Printer Actor實例。
然後該示例將消息發送給Greeter Actor實例,並將其存儲在內部。最後,給Greeter Actors的指令消息觸發它們發送消息給Printer Actor,它將它們輸出到控製台:
Akka使用Actor和異步消息傳遞會帶來一係列好處。
使用Actor模型的好處
Akka的以下特征使您能夠以直觀的方式解決困難的並發性和可伸縮性挑戰:
- 事件驅動模型 – Actor根據消息執行工作。參與者之間的通信是異步的,允許參與者發送消息並繼續他們自己的工作,而不會阻止等待答複。
- 強大的隔離原則 – 與Scala中的常規對象不同,Actor沒有可調用的方法的公共API。相反,它的公共API是通過actor處理的消息定義的。這可以防止Actor之間的任何狀態共享;觀察另一個演員的狀態的唯一方法是向它發送一條消息。
- 位置透明度 – 係統從工廠構造Actors並返回對實例的引用。由於位置無關緊要,因此Actor實例可以啟動,停止,移動和重新啟動以便向上和向下縮放以及從意外故障中恢複。
- 輕量級 – 每個實例隻消耗幾百個字節,這實際上允許數百萬並發Actor存在於單個應用程序中。