文章目录
我们从整体的角度看一下Flink RPC通信框架的设计与实现,了解其底层Akka通信框架的基础概念及二者之间的关系。
1. Akka基本概念与Actor模型
Akka是使用Scala语言编写的库,用于在JVM上简化编写具有可容错、高可伸缩性的Java或Scala的Actor模型。Akka基于Actor模型,提供了一个用于构建可扩展、弹性、快速响应的应用程序的平台。
Actor 模型是一种并发计算模型,Actor 模型的核心思想是将计算单元抽象为独立的并发实体,称为 “actors”,这些 actors 之间通过消息传递进行通信。
以下是 Actor 模型的一些关键概念:
- Actor:Actor 是计算模型的基本执行单元。每个 Actor 都有自己的状态、行为和邮箱(用于接收消息)。Actor 之间是相互独立的,它们通过消息传递进行通信。
- 消息传递:在 Actor 模型中,通信是通过消息传递来实现的。一个 Actor 可以向另一个 Actor 发送消息,消息包含了要执行的操作或者改变状态的请求。这种异步消息传递使得系统更具有弹性和可伸缩性。
- 地址:每个 Actor 都有一个唯一的地址,用于唯一标识该 Actor。其他 Actor 可以使用地址向目标 Actor 发送消息。
- 邮箱:每个 Actor 都有一个邮箱,
用于存储接收到的消息
。Actor 处理消息的速度可能不同,但由于消息传递是异步的,这不会阻塞发送者。- 行为:Actor 的行为定义了对消息的
响应方式
,包括状态的修改、消息的处理等。行为可以随着时间和接收到的消息而动态变化。
Actor由状态(State)、行为(Behavior)和邮箱(Mailbox)三部分组成。
actors和其他actors通过发送异步消息通信。Actor模型的强大来自于异步。它也可以显式等待响应,这使得可以执行同步操作。但是,强烈不建议同步消息,因为它们限制了系统的伸缩性(?怎么实现的伸缩性)。
actor系统
每个actor是一个单一的线程,它不断地从其邮箱中poll(拉取)消息,并且连续不断地处理。对于已经处理过的消息的结果,actor可以改变它自身的内部状态或者发送一个新消息或者
孵化一个新的actor
。
2. Akka相关demo
2.1. 创建Akka系统
Akka系统的核心组件包括ActorSystem和Actor,构建一个Akka系统,首先需要创建ActorSystem,然后通过ActorSystem创建Actor。
需要注意的是:
- Akka不允许直接创建Actor实例,只能通过ActorSystem.actorOf和ActorContext.actorOf等特定接口创建Actor。
- 只能通过ActorRef与Actor进行通信,ActorRef对原生Actor实例做了良好的封装,外界不能随意修改其内部状态。
如代码所示,Akka系统中包含了创建ActorSystem以及Actor的基本实例。
// 1. 构建ActorSystem
// 使用缺省配置
ActorSystem system = ActorSystem.create("sys");
// 也可显示指定appsys配置
// ActorSystem system1 = ActorSystem.create("helloakka", ConfigFactory.load("appsys"));
// 2. 构建Actor,获取该Actor的引用,即ActorRef
ActorRef helloActor = system.actorOf(