示例简介

在写散文时,最难的部分往往是编写前几句话。在开始构建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

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

Akka的Actor层级结构《seven》译相关推荐

  1. Akka的Actor生命周期《Eight》译

    Actor在创建时出现,然后在用户请求时停止.每当一个Actor停止时,它的所有孩子也会被递归停止.此行为极大地简化了资源清理,并有助于避免资源泄漏,例如由打开的套接字和文件引起的资源泄漏.事实上,处 ...

  2. java akka actor_AKKA Actor创建

    Actor 类定义 Actor 类需要继承AbstractActor类 实现createReceive方法,绑定各类actor收到不同类型消息对应处理不同业务逻辑 默认提供了ReceiveBuilde ...

  3. 三级结构_kegg pathway三级层级结构转对应表格

    先上图,如果不是需要的就可以不用往下看了. 首先是什么样的层级结构,如下图,有些长,不完整,完整的图太长上传不了,打开链接https://www.genome.jp/kegg/pathway.html ...

  4. DL之DNN:自定义2层神经网络TwoLayerNet模型(封装为层级结构)利用MNIST数据集进行训练、预测

    DL之DNN:自定义2层神经网络TwoLayerNet模型(封装为层级结构)利用MNIST数据集进行训练.预测 导读           计算图在神经网络算法中的作用.计算图的节点是由局部计算构成的. ...

  5. DL之DNN:自定义2层神经网络TwoLayerNet模型(封装为层级结构)利用MNIST数据集进行训练、GC对比

    DL之DNN:自定义2层神经网络TwoLayerNet模型(封装为层级结构)利用MNIST数据集进行训练.GC对比 导读           神经网络算法封装为层级结构的作用.在神经网络算法中,通过将 ...

  6. DL之CNN:卷积神经网络算法简介之原理简介(步幅/填充/特征图)、七大层级结构(动态图详解卷积/池化+方块法理解卷积运算)、CNN各层作用及其可视化等之详细攻略

    DL之CNN:卷积神经网络算法简介之原理简介(步幅/填充/特征图).七大层级结构(动态图详解卷积/池化+方块法理解卷积运算).CNN各层作用及其可视化等之详细攻略 目录 CNN 的层级结构及相关概念 ...

  7. linux 进程间通信 dbus-glib【实例】详解三 数据类型和dteeth(类型签名type域)(层级结构:服务Service --> Node(对象、object) 等 )(附代码)

    linux 进程间通信 dbus-glib[实例]详解一(附代码)(d-feet工具使用) linux 进程间通信 dbus-glib[实例]详解二(上) 消息和消息总线(附代码) linux 进程间 ...

  8. Akka的Hello World(一)Akka的Actor架构

    一. Actor层次结构 Akka的Actor总会有他的父母.通常,您通过调用getContext().actorOf()创建一个actor .这不是创建一个"独立"Actor,而 ...

  9. CVPR 2022 | CNN自监督预训练新SOTA:上交、Mila、字节联合提出具有层级结构的图像表征自学习新框架...

    ©作者 | 机器之心编辑部 来源 | 机器之心 来自上海交通大学.Mila 魁北克人工智能研究所以及字节跳动的研究者提出了一种具有层级语义结构的自监督表征学习框架,在 ImageNet 数据集上预训练 ...

最新文章

  1. 编写可调模板并使用Auto-tuner自动调谐器
  2. max_semi_space_size 设置值与实际值不一致的原因分析
  3. 软件测试培训 高级测试/测试开发基本技能列表
  4. SQLite可视化管理工具汇总
  5. 北京对无人车的热情,华尔街都感受到了
  6. oracle 24365,深入解析:DBA_OBJECTS中的OBJECT_ID与DATA_OBJECT_ID的区别
  7. Javascript的闭包及其使用技巧实例
  8. SpringMVC 实现注册登录
  9. python之sys模块【获取参数】
  10. 【下一代核心技术DevOps】:(三)私有代码库阿里云Git使用
  11. 开发自己的框架——(二)数据库工具类的封装
  12. VC++的dll中接收消息
  13. python 统计组合用什么库_Python机器学习需要用到的库
  14. Linux——Centos7网络配置1ens33文件
  15. 今日恐慌与贪婪指数为23 恐慌程度有所缓解
  16. docker web程序本地化_Docker 容器化部署 Python 应用
  17. python做病毒传播的空间数据_利用4行Python代码监测每一行程序的运行时间和空间消耗...
  18. kafka buffer.memory参数入门
  19. POJ-2762 Going from u to v or from v to u?
  20. Codeforces 1006 F - Xor-Paths

热门文章

  1. [转载] Python time sleep()方法如何使用?
  2. JQuery之事件冒泡
  3. Spring Boot与Docker部署
  4. KB奇遇记(9):艰难的上线
  5. Android权威编程指南读书笔记(1-2章)
  6. 程序执行系统VC++程序出现“试图执行系统不支持的操作”
  7. QT连接MySQL记录
  8. php实现抽象工厂模式(转)
  9. 关于在CLASSWIZARD中找不到工作区间中的类的解决方法
  10. 如何解决VC++ 6.0 在win7下的兼容性问题