akka学习笔记完整版

 

(3)在编写java线程的时候,要传递不可变对象,这里akka也是如此

(4) preStart是restartActor初始化时调用的,他的hashcode是463293128,接着遇到空指针异常,根据自定义策略,会重启该actor。此时会调用preRestart,注意他的hashcode依然是463293128,因为preRestart是在正式启动前在老的actor上调用的。 随后打印出preStart,说明新的actor开始创建了,他的hashcode是1195770342,新的actor实例将替代旧的实例工作,这说明同一个restartActor工作的过程中,未必真的是同一个actor。重启完成之后调用postRestart.再经历3次(自定义策略配置的)重启以后,达到重启上限,系统将直接关闭该actor。

(5) 整个akka的actor系统是通过消息进行传递的,之前的几个教程都是通过一个actor来给另一个actor发消息。其实还可以使用inbox消息收件箱来给某个actor发消息,并且可以进行交互。

(6)通常在分布式任务调度系统中会有这样的需求:一组actor提供相同的服务,我们在调用任务的时候只需要选择其中一个actor进行处理即可。
其实这就是一个负载均衡或者说路由策略,akka作为一个高性能支持并发的actor模型,可以用来作为任务调度集群使用,当然负载均衡就是其本职工作了,akka提供了Router来进行消息的调度。

(7) 在actor运行过程中,可能会有多种状态,各个状态间可能会存在切换的情况,akka已经帮我们考虑到这种情况情况的处理:Procedure

(8) 和java线程中的future挺像的,可以将一个actor的返回结果重定向到另一个actor中进行处理,主actor或者进程无需等待actor的返回结果。

(9)软件事务内存(STM:顾名思义,这是事务。与关系型数据库中的事务类似,具有ACID(原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。一个支持事务(Transaction)的数据库,必须要具有这四种特性,否则在事务过程(Transaction processing)当中无法保证数据的正确性,交易过程极可能达不到交易方的要求。)属性。 在分布式任务中,有可能会有和事务相关的处理,这里将举例说明AKKA中STM的用法。

(10) 使用agent来实现共享变量的安全处理。

(11) Akka持久化可以使有状态的actor能够保持其内部状态,以便在启动、JVM崩溃后重新启动、或在集群中迁移时,恢复它们的内部状态。 Akka持久性关键点在于,只有对actor内部状态的更改才会被持久化,而不会直接保持其当前状态(可选快照除外)。 这些更改只会追加到存储,没有任何修改,这允许非常高的事务速率和高效的复制。 通过加载持久化的数据Stateful actors可以重建内部状态。 这可以是所有修改的完整历史记录,也可以从一个快照开始,这可以显着减少恢复时间。 Akka持久性还提供至少一次消息传递语义的点对点通信

(12) 近年来随着Spark的火热,Spark本身使用的开发语言Scala、用到的分布式内存文件系统Tachyon(现已更名为Alluxio)以及基于Actor并发编程模型的Akka都引起了大家的注意。了解过Akka或者Actor的人应该知道,这的确是一个很不错的框架,按照Akka官网的描述——使用Akka使得构建强有力的并发与分布式应用将更加容易。由于历史原因,很多Web系统在开发分布式服务时首先会选择RMI(Remote Method Invoke ,远程方法调用)、RPC(Remote Procedure Call Protocol,远程过程调用)或者使用JMS(Java Messaging Service,Java消息服务)。
 但是使用RMI只能使用java语言,而且开发、执行效率都不高;RPC框架虽然可以通过匹配方法签名的方式比RMI更灵活,但是其存在调用超时、调用丢失等缺点;JMS方式虽然可以通过At Least Delivery Once、消息持久化等机制保证消息不会丢失,但是只能作为一种跨服务的生产者、消费者编程模型使用。Akka不但处理了以上问题,而且还可以使用Actor作为并发编程模型,减少java多线程编程的阻塞、调度、上下文开销甚至死锁等问题。此外,Akka还提供了集群Sharding、流处理等功能的支持,更易于实现有限状态自动机等功能。所以有心的开发者势必会关心如何在最常见的Java系统中使用它,如何与spring集成?
什么是ActorSystem?根据Akka官网的描述——ActorSystem是一个重量级的结构体,可以用于分配1到N个线程,所以每个应用都需要创建一个ActorSystem。通常而言,使用以下代码来创建ActorSystem。
ActorSystem system = ActorSystem.create("Hello"); 

一般情况下我们的Actor都需要继承自UntypedActor,并实现其onReceive方法。onReceive用于接收消息,你可以在其中实现对消息的匹配并做不同的处理。

(13) Akka群集提供容错分散的对等群集成员服务,没有单点故障或单点瓶颈。 它使用gossip协议和自动故障检测器。(分布式)

使用akka需要自己进行服务的发现治理工作。但是著名的spark都完全依赖akka,所以我们在工作中是可以使用akka的。当然akka的一些概念比较困难,学习路线比较长,所以想要学会也需要一些时日,必须经过深入学习实战才可。

posted on 2018-03-08 22:00  Rainrun  阅读(480)  评论(0编辑  收藏  举报