Akka的Actor层级结构《seven》译

示例简介 

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

准备部分

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

IoT例子

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

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

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

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

    下图说明了示例应用程序体系结构。由于我们对每个传感器设备的状态感兴趣,因此我们将设备设计为Actor。正在运行的应用程序将根据需要创建尽可能多的设备Actor和设备组实例。

您将在本教程中学到什么

    本教程介绍并说明:

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

    让我们开始学习更多关于Actor的内容。

Dependency

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

Actor层次结构

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

    如下图所示,所有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

有什么讨论的内容,可以加我公众号:

猜你喜欢

转载自blog.csdn.net/woshiyexinjie/article/details/82322151
今日推荐