Akka的Actor层级结构《seven》译

示例简介 

    在写散文时,最难的部分每每是编写前几句话。在开始构建Akka系统时,有一种相似的“空白画布”的感受。你可能想知道:哪一个应该是第一个Actor?它应该住在哪里?它该怎么办?幸运的是 - 与散文不一样,已创建的最佳实践能够指导咱们完成这些初步步骤。在本指南的其他部分,咱们将研究一个简单的Akka应用程序的核心逻辑,向您介绍Actor并向您展现如何使用它们制定解决方案。该示例演示了可帮助您启动Akka项目的常见模式。html

准备部分

    您应该已经按照Akka Quickstart with Java guide指南中的说明下载并运行Hello World示例。您将使用它做为种子项目并添加本教程中描述的功能。java

IoT例子

    在本教程中,咱们将使用Akka构建物联网(IoT)系统的一部分,该系统报告来自客户家中安装的传感器设备的数据。该示例着重于温度读数。目标用例容许客户登陆并查看他们家中不一样区域的最后报告温度。您能够想象这样的传感器还能够收集相对湿度或其余有趣的数据,而且应用程序可能支持读取和更改设备配置,甚至可能在传感器状态超出特定范围时警告房主。浏览器

    在真实系统中,应用程序将经过移动应用程序或浏览器向客户公开。本指南仅关注用于存储将经过网络协议调用的温度的核心逻辑,例如HTTP。它还包括编写测试,以帮助您得到测试Actor的温馨和熟练。安全

    教程应用程序包含两个主要组件:网络

  • 设备数据收集: - 维护远程设备的本地表示。用于家庭的多个传感器设备被组织成一个设备组。
  • 用户仪表板: - 按期从设备收集登陆用户家中的数据,并将结果显示为报告。

    下图说明了示例应用程序体系结构。因为咱们对每一个传感器设备的状态感兴趣,所以咱们将设备设计为Actor。正在运行的应用程序将根据须要建立尽量多的设备Actor和设备组实例。ide

您将在本教程中学到什么

    本教程介绍并说明:学习

  • Actor层次结构及其如何影响Actor行为
  • 如何为Actor选择合适的粒度
  • 如何将协议定义为消息
  • 典型的会话风格

    让咱们开始学习更多关于Actor的内容。测试

Dependency

    使用Akka能够减轻您为actor系统建立基础结构的麻烦,也能够减小编写控制基本行为所需的低级代码。为了理解这一点,让咱们看一下您在代码中建立的actor与Akka在内部为您建立和管理的actor之间的关系,actor生命周期和失败处理。
ui

Actor层次结构

    Akka的Sctor老是属于他的父母。一般,您经过调用getContext().actorOf()来建立actor。这不是建立一个“独立”Actor,而是将新Actor做为孩子注入已经存在的树中:建立者Actor成为新建立的子演员的父级。你可能会问,你建立的第一个Actor的父母是谁?spa

    以下图所示,全部Actor都有一个共同的父母,即用户监护人。可使用system.actorOf()在此actor下建立新的actor实例。正如咱们在快速入门指南中所述,建立actor会返回一个有效URL的引用。所以,例如,若是咱们使用system.actorOf(...,“someActor”)建立一个名为someActor的actor,它的引用将包含路径 / user / someActor

    实际上,在代码中建立actor以前,Akka已经在系统中建立了三个actor。这些内置Actor的名字包含监护人,由于他们监督他们路径中的每一个儿童Actor。监护人演员包括:

  • /the so-called root guardian 这是系统中全部actor的父级,也是系统自己终止时中止的最后一个。
  • /user 这是全部用户建立的actor的父actor。
  • /system 系统监护

    在Hello World示例中,咱们已经看到system.actorOf()如何直接在/ user下建立一个actor。咱们将其称为顶级actor,尽管实际上它只位于用户定义的层次结构的顶部。您的ActorSystem中一般只有一个(或极少数)顶级actor。咱们经过从现有actor调用context.actorOf()来建立子级或非顶级actor。context.actorOf()方法的签名与system.actorOf()相同,后者是它的顶级对应物。

    查看actor层次结构的最简单方法是打印ActorRef实例。在这个小实验中,咱们建立一个actor,打印它的引用,建立这个actor的子元素,并打印子元素的引用。咱们从Hello World项目开始,若是您尚未下载它,请从Lightbend Tech Hub下载Quickstart项目。

    在Hello World项目中,导航到com.lightbend.akka.sample包并在此处建立一个名为ActorHierarchyExperiments.java的新Java文件。将如下代码段中的代码复制并粘贴到此新源文件中。保存文件并运行sbt“run Main com.lightbend.akka.sample.ActorHierarchyExperiments”以观察输出。

    请注意消息要求第一个Actor执行其工做的方式。咱们使用父级的引用发送消息:firstRef.tell(“printit”,ActorRef.noSender())。当代码执行时,输出包括第一个actor和它做为printit case的一部分建立的子节点的引用。您的输出应相似于如下内容:

注意引用的结构:

  • 两条路径都以akka:// testSystem /开头。因为全部actor引用都是有效的URL,所以akka://是协议字段的值。
  • 接下来,就像在网上同样,URL标识系统。在此示例中,系统名为testSystem,但它能够是任何其余名称。若是启用了多个系统之间的远程通讯,则URL的这一部分包含主机名,以便其余系统能够在网络上找到它。
  • 由于第二个actor的引用包含path / first-actor /,因此它将它标识为第一个actor的子节点
  • actor参考的最后一部分#1053618476或#-1544706041是一个惟一的标识符,在大多数状况下你能够忽略它。

    如今您已经了解了actor层次结构的样子,您可能想知道:为何咱们须要这种层次结构?它是干什么用的?

    层次结构的一个重要做用是安全地管理actor的生命周期。让咱们接下来考虑一下,看看这些知识如何帮助咱们编写更好的代码。

原文:https://doc.akka.io/docs/akka/current/guide/tutorial.html

有什么讨论的内容,能够加我公众号:

相关文章
相关标签/搜索