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存在于单个应用程序中。