一 Akka 简介
1 akka 的定义
Akka是JAVA虚拟机平台上构建高并发、分布式和容错应用的工具包, 是异步、非阻塞、高性能的事件驱动编程模型 / 通信框架。Akka用Scala语言编写,同时提供了Scala和Java的开发接口。Akka处理并发的方法基于Actor模型,Actor之间通信的唯一机制就是消息传递。
在Akka中执行单元是Actor ,在Actor模型中并不是通过Actor对象的某个方法来告诉Actor需要做什么,而是给Actor发送一条消息。当一个Actor收到消息后,它有可能根据消息的内容做出某些行为,如更改自身状态,此时这个状态的更改是Actor自身进行的,并非由外界干预进行的。
2 Actor 的作用和特点
2.1 Actor是用来接收发送消息,处理逻辑的
2.2 ActorSystem 是单例的,一个进程中只要有一个即可,它是用来创建Actor的,并且监控和管理他创建的Actor
2.3 Actor是多例的,可以创建多个实例
2.4 Actor编程模式就通过送消息来实现并发的 ,Actor 可以处理多种类型的消息 .
2.5 Akka就是基于Actor编程模型实现的,可以是单机,也可以是分布式的
2.6 高容错(错误恢复) ,有一个 Actor 池 ,每个Actor 会处理不同的事件 ,Actor 做的事情可能会抛出异常 ,而它自己无法从中恢复 .这种情况下 ,需要再生产(created) 一个新的 Actor 来顶替它 .也就是说这个新的 Actor 会忽略刚才那条消息 ,继续处理剩余的消息 .这些也被称为指令 (Directive).
二 Akka 通信原理
1 先启动 Master (这是一个进程)
2 然后启动所有的 Worker(每个 Worker 都是一个进程)
3 Worker 向 Master 建立连接 ,然后向 Master 发送注册消息(workerID ,workerMemory ,workerCore)
4 Master 接收到 Worker 发送的注册消息后 ,将注册数据封装起来,然后保存;
5 Master 将 Worker 的注册数据保存后 ,将注册成功的消息返回给 Worker ;
6 Worker 接收到注册成功的消息后 ,开启定时器 ,定期(每10s)向 Master 发送心跳 ,以此证明自己没有掉线 ;
7 Master 接收到 Worker 发送的心跳信息之后 , 根据 Worker 提供的 workerID ,到 Map 里面找到对应的 workerInfo ,然后获取接收心跳时的当前系统的时间 ,更新 Worker 的最新的心跳时间 .
8 Master 机器上也有一个定时器 ,定期(每15s)检测自己身上所有的 Worker ,是否有超时的worker ,如果 Worker 超时了, 需要将超时的 workerID 移除 .
二 Akka在java端 Mawen 项目的安装
1 进入 IDEA 界面 ,在工具栏上点击 File--->New---->Project--->Maven---->Next
2 将项目名(Name) 和项目存储位置(Location) 设置好
3 将 Artifact Coordinates 展开 ,设置 GroupId (比如写成 com.akka.rpc)
4 最后点击 Finish ,即完成项目的设置 .
三 安装好Mawen 项目后 ,运行环境的准备
在 pom.xml 中,添加 akka 运行时需要的依赖(dependencies) ,和插件(build)
<!-- 常量 -->
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<encoding>UTF-8</encoding>
<scala.version>2.12.10</scala.version>
<scala.compat.version>2.12</scala.compat.version>
<akka.version>2.4.17</akka.version>
</properties>
<dependencies>
<!-- scala的依赖 -->
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>${scala.version}</version>
</dependency>
<!-- akka actor依赖 -->
<dependency>
<groupId>com.typesafe.akka</groupId>
<artifactId>akka-actor_${scala.compat.version}</artifactId>
<version>${akka.version}</version>
</dependency>
<!-- akka远程通信依赖 -->
<dependency>
<groupId>com.typesafe.akka</groupId>
<artifactId>akka-remote_${scala.compat.version}</artifactId>
<version>${akka.version}</version>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<!-- 编译scala的插件 -->
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<!-- 编译java的插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<executions>
<execution>
<id>scala-compile-first</id>
<phase>process-resources</phase>
<goals>
<goal>add-source</goal>
<goal>compile</goal>
</goals>