(一)IoT系统介绍

通过了解Actor的层次结构和行为,剩下的问题是如何将IoT系统的顶层组件映射到actor。将代表设备和仪表板的Actor放在顶层可能很诱人。相反,我们建议创建一个代表整个应用程序的显式组件。换句话说,我们将在物联网系统中拥有一名顶级Actor。创建和管理设备和仪表板的组件将是此Actor的子组件。这允许我们将IoT系统用Actor树来表示:

(二)IoT系统的顶层

我们可以使用几行简单的代码来定义第一个actor,即IotSupervisor。

import akka.actor.AbstractActor;
import akka.actor.Props;
import akka.event.Logging;
import akka.event.LoggingAdapter;public class IotSupervisor extends AbstractActor {private final LoggingAdapter log = Logging.getLogger(getContext().getSystem(), this);public static Props props() {return Props.create(IotSupervisor.class, IotSupervisor::new);}@Overridepublic void preStart() {log.info("IoT Application started");}@Overridepublic void postStop() {log.info("IoT Application stopped");}// No need to handle any messages@Overridepublic Receive createReceive() {return receiveBuilder().build();}
}
import java.io.IOException;import akka.actor.ActorSystem;
import akka.actor.ActorRef;public class IotMain {public static void main(String[] args) throws IOException {ActorSystem system = ActorSystem.create("iot-system");try {// Create top level supervisorActorRef supervisor = system.actorOf(IotSupervisor.props(), "iot-supervisor");System.out.println("Press ENTER to exit the system");System.in.read();} finally {system.terminate();}}
}

(三)设备actor

如果我们使用对象,我们通常会将API设计为接口,这是由实际实现填充的抽象方法的集合。在Actor的世界中,协议取代了接口。虽然不可能在编程语言中形式化通用协议,但我们可以编写它们最基本的元素,即消息。因此,我们将首先确定要发送给设备Actor的消息。

通常,消息属于类别或模式。通过识别这些模式,您会发现在它们之间进行选择并实现它们变得更加容易。
设备actor的任务很简单:
•    收集温度测量值
•    当被问到时,报告最后测量的温度

但是,设备可能在启动时没有立即进行温度测量。因此,我们需要考虑温度不存在的情况。这也允许我们在没有写入部分的情况下测试actor的查询部分,因为设备actor可以报告空结果。
用于从设备actor获得当前温度的协议是简单的。
1.    等待当前温度的请求。
2.    响应请求并回复:包含当前温度或者表示温度尚不可用。

我们需要两条消息,一条用于请求,另一条用于回复。
这两条消息似乎涵盖了所需的功能。但是,我们选择的方法必须考虑应用程序的分布式特性。虽然与本地JVM上的actor进行通信的基本机制与远程actor相同,但我们需要牢记以下几点:
•    本地和远程消息之间的传递延迟将存在可观察到的差异,因为网络链路带宽和消息大小等因素也会发挥作用。
•    可靠性是一个问题,因为远程消息发送涉及更多步骤,这意味着更多可能出错。
•    本地发送将传递对同一JVM内的消息的引用,而不会对发送的基础对象进行任何限制,而远程传输将对消息大小设置限制。
此外,虽然在同一个JVM内部发送更可靠,但如果一个Actor在处理消息时由于程序员错误而失败,其效果就像远程主机请求因处理消息时远程主机崩溃而失败一样。即使在这两种情况下,服务都会在一段时间后恢复(Actor由其supervisor重新启动,host由运营商或监控系统重新启动)在崩溃期间各个请求都会丢失。因此,写下你的Actor,使每条消息都可能丢失,这是安全、悲观的赌注。
但是为了进一步理解协议的灵活性需求,将有助于考虑Akka消息排序和消息传递保证。Akka为消息发送提供以下行为:
•    最多一次传递,即无保证传递。
•    每个发送者、接收者对维护消息排序。

一、消息传递

消息传递子系统提供的传递语义通常分为以下几类:
•    最多一次发送 - 每条消息一次或零次发送 ; 在更多的因果关系中,这意味着消息可能会丢失,但永远不会重复。
•    至少一次传递 - 可能会多次尝试传递每条消息,直到至少一次成功; 这意味着消息可以重复,但永远不会丢失。
•    完全一次发送 - 每条消息只发送一次给收件人; 消息既不会丢失也不会重复。
第一种方式是最便宜的,并且性能最高。它具有最少的实现开销,因为它可以以一种即发即忘的方式完成,而不会将状态保持在发送端或传输机制中。第二种方式,需要至少一次重试以抵消运输损失。这增加了将状态保持在发送端并在接收端具有确认机制的开销。第三种方式完全一次交付是最昂贵的,并且导致最差的性能:除了至少一次交付所增加的开销之外,它还要求将状态保持在接收状态以便过滤掉重复的交付。
在Actor系统中,我们需要保证一个确切的含义 - 系统在何时将发送视为已完成:
1.    当消息在网络上发送出去?
2.    当目标actor的主持人收到消息时?
3.    当消息被放入目标actor的邮箱时?
4.    当消息目标actor开始处理消息时?
5.    目标actor何时成功处理了消息?
大多数声称保证交付的框架和协议实际上提供了类似于第4点和第5点的内容。虽然这听起来很合理,但它实际上有用吗?要理解其含义,请考虑一个简单实用的示例:用户尝试下订单,一旦它成功写在订单数据库中的磁盘上。我们就声明它已经成功处理。
如果我们依赖于成功处理消息,则只要订单已提交给负责验证它的内部API,处理它并将其放入数据库,actor就会报告成功。不幸的是,在调用API之后,可能会发生以下任何一种情况:
•    主机可能崩溃。
•    反序列化可能会失败。
•    验证可能会失败。
•    数据库可能不可用。
•    可能会发生编程错误。
这表明发送的保证不会转化为domain级保证。我们只想在订单实际完全处理和存储后报告成功。可以报告成功的唯一实体是应用程序本身,因为只有它对所需的domain保证有了解。没有通用框架可以弄清楚特定domain的细节以及在该域中被认为是成功的。
在这个特定的例子中,我们只希望在成功的数据库写入后发出成功信号,数据库确认订单现在已安全存储。由于这些原因,Akka将保证的责任提升到应用程序本身,即您必须使用Akka提供的工具自行实现它们。这使您可以完全控制要提供的保证。现在,让我们考虑Akka提供的消息排序,以便于推理应用程序逻辑。

二、消息排序

在Akka中,对于给定的一对Actor,直接从第一个发送到第二个的消息将不会被无序接收。这强调,这种保证仅适用于将tell的operator直接发送到最终目的地,而不是在使用mediators时。
如果:
•    Actor A1发送消息M1,M2,M3到A2。
•    Actor A3发送消息M4,M5,M6到A2。
这意味着,对于Akka消息:
•    如果发送M1,必须在M2和之前发送M3。
•    如果发送M2,必须在之前交付M3。
•    如果发送M4,必须在M5和之前发送M6。
•    如果发送M5,必须在之前发送M6。
•    A2可以看到来自A1交错信息的消息A3。 
•    由于没有保证传递,任何消息都可能被丢弃,即没有到达A2。
这些保证达到了良好的平衡:让一个Actor的消息按顺序到达对于构建易于追溯的系统是方便的,而另一方面允许来自不同Actor的消息交错到达提供了足够的自由来有效地实现Actor系统。

Akka之在IoT系统中使用Actor(一)相关推荐

  1. 用例图USE CASE中的Actor之眼让你不再雾里看花

    叙说一个IT从业30多年的程序猿是如何从技术中领悟到世间之理,并4次成功创业的感悟! 叙说程序猿眼中的人文世界,分享的主题如下: 程序那点事:用例图中的Actor之眼 程序猿人生:建设银行分布式面向对 ...

  2. 在大规模系统中使用Scala

    本文是关于在大规模数据储存及分析系统中使用Sacla系列文章中的第一篇. \\ 在过去几年间,已经有多个项目使用了Scala进行大规模数据储存及分析平台的设计. \\ BBC在设计公司内部的RDF数据 ...

  3. akka mysql_Akka系列(七):Actor持久化之Akka persistence

    这次把这部分内容提到现在写,是因为这段时间开发的项目刚好在这一块遇到了一些难点,所以准备把经验分享给大家,我们在使用Akka时,会经常遇到一些存储Actor内部状态的场景,在系统正常运行的情况下,我们 ...

  4. 在.NET中实现Actor模型的不同方式

    上周,<实现领域驱动设计>(Implementing Domain-Driven Design)一书的作者Vaughn Vernon,发布了Dotsero,这是一个使用C#编写的.基于.N ...

  5. 用例图中的Actor(参与者)一定是人吗?

    用例图中的Actor(参与者)一定是人吗?答案是否定的! 参考: 参与者不是特指人,是指系统以外的,在使用系统或与系统交互中所扮演的角色.因此参与者可以是人,可以是事物,也可以是时间或其他系统等等.还 ...

  6. win10iot c语言,值还是不值?——树莓派3 Win10 IoT系统体验

    爱板网正在举办e络盟杯树莓派创意设计大赛,以树莓派3B和创意设计为主题,大赛e络盟官方会根据参赛者填写的申请理由,选取50名幸运儿赠送500元e络盟商城购物基金用于领取大赛项目所需器件,欢迎感兴趣的朋 ...

  7. 网络通讯技术在嵌入式系统中的应用

    网络通讯技术在嵌入式系统中的应用 一.嵌入式系统的由来 1.1 嵌入式系统的概念:       嵌入式系统是以应用为中心,以现代计算机技术为基础,能够根据用户需求(功能.可靠性.成本.体积.功耗.环境 ...

  8. Win10 IoT C#开发 1 - Raspberry安装IoT系统及搭建开发环境

    原文:Win10 IoT C#开发 1 - Raspberry安装IoT系统及搭建开发环境 Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,与以往的Windows版本不同, ...

  9. 如何在鸿蒙系统中移植 Paho-MQTT 实现MQTT协议

    MQTT 是当前最主流的物联网通信协议,需要物联网云平台,例如华为云.阿里云.移动OneNET都支持mqtt.而Hi3861则是一款专为IoT应用场景打造的芯片.本节主要讲如何在鸿蒙系统中通过移植第3 ...

最新文章

  1. 关于SQL SERVER高并发解决方案
  2. MFC的Button和Static控件
  3. springboot项目整个的启动流程
  4. 《恋上数据结构第1季》集合 ListSet、TreeSet、HashSet
  5. cisco 模拟器安装及交换机的基本配置实验心得_网络工程师的Python之路 -- 自动监测网络配置变化...
  6. 在SharePoint2007中使用TimeJob.
  7. Android APK 签名问题
  8. 【C++:类和对象】处理一个线性表,动态产生线性存储空间,并实现线性表的部分操作
  9. 怎么关闭eureka的服务_SpringCloud之Eureka
  10. android逆向学习路线(适合新手)
  11. css规则中区块block,听晴空讲Drupal主题——第六章 主题中的CSS(10)
  12. 坚持住啊,还在代码屎山中爬行的同事们
  13. 聊聊精密测量仪器的气源维护知识
  14. 一份Java面试宝典「Java核心知识点」囊括JVM,Spring等29个技术
  15. 华三模拟器HCL常用命令
  16. 可能是你见过最强的猜数字游戏(doge
  17. S3C6410(OK6410开发板介绍)
  18. java语言基础 : 初识计算机和Java语言-----java初识之路
  19. mysql DATE_FORMAT时间格式化
  20. 一个字节中的1的个数

热门文章

  1. cpu,内核和逻辑处理器的关系
  2. python tensorflow tf.layers.max_pooling2d() 2维输入(例如图像)的最大池化层
  3. python numpy中ndarray.reshape函数参数-1是什么意思?(模糊控制、自动推理)
  4. python添加系统环境win7_python环境配置(基于win7 x64)
  5. python数据分析是什么意思_python数据分析有什么用
  6. ssh框架点击按钮就404_设置404错误页面的5大关键因素
  7. 苹果手机home键在哪里_苹果手机为什么没有返回键?原来隐藏着更好的方法,涨知识了...
  8. menisa mysql_实例详细说明linux下去除重复行命令uniq
  9. python 判断类型_青少年之Python编程课程安排lt;第一季gt;
  10. idea 新建的java项目没发run_IDEA 如何创建一个普通的 Java 项目,及创建 Java 文件并运行...