Akka简介
一、知识补充
耦合与解耦:
耦合 --》两个或两个以上体系或两种运动形式间通过相互作用而彼此影响以至联合起来的现象
对于软件工程,对象之间的耦合度是对象之间的依赖度,耦合程度越高,维护成本越高
解耦 --》解除耦合关系
模块间有依赖关系必然存在耦合,理论上绝对零耦合做不到。要使数据模型,业务逻辑,视图显示三层之间彼此降低耦合,把关系依赖降低
RPC(Remote Procedure Call)
RPC 用于同一组件中各个不同模块之间的通信(面向过程)
RESTful 用于各组件之间的通信, 或用于组件对外提供调用接口(面向资源)
RMI :Java提供的一种访问远程对象的协议,可以在RPC框架内使用RMI实现数据传输
二、Actor
Akka 基于Actor
Actor很像消息队列,但不需要额外配置和安装消息代理。消息是简单的数据结构,创建后不可更改。
Actor每次接受一条消息,并执行某些行为;Actor不像队列,可以(向其他Actor)发送消息。
Actor异步执行。
三、并行编程模型
四、以聊天软件为例,构建Akka框架
Actor 异步创建、发送、改变和监督。
1、发送
Actor只能与其他Actor通过发送消息进行交互。Actor不允许访问他的内部状态,Actor不能共享互斥状态。
发送消息通常是异步的,也称为即发即弃风格。如果要知道另一个Actor是否收到消息,那么接受消息的Actor会发送某种类型的响应消息。
异步消息可以帮助应用中各组件解耦,消息不可改变,这意味着一旦创建不可更改。Actor可以接收任何消息,并且可以向Actor发送任何消息。
在发送和接受消息的Actor之间,消息发送是有顺序的。一个Actor一次只能接受一条消息。消息的顺序只能由发送Actor来保证。如果多个用户同时修改会话中的同一条消息,则最终结果与消息随时间交织而变化。
2、创建
Actor可以创建其他Actor。
3.改变
状态机是保证系统在特定状态时执行特定功能的有力工具。
Actor每次接受一条消息,这种性质适合实现状态机。一个Actor可以通过交换他的行为来改变它处理传入的消息的方式。
4、监督
任何Actor都可以作为监督器,但只能管理自己创建的Actor。
备注:
Actor在三个维度上进行解耦
空间 -- Actor无法保证,也不期望知道另一个Actor在哪里。
时间 -- Actor不能保证,也无法预期它的工作何时完成。
接口 -- Actor没有定义的接口,Actor不需要知道其他组件理解什么样的信息。
五、了解Akka Actor
ActorSystem
任何Akka应用第一件事就是创建ActorSystem。ActorSystem能够创建顶层Actor,一般情况下只创建一个顶层Actor。ActorSystem是支持这些功能的纽带,如调度功能,它可以周期地向Actor发送消息。
ActorSystem返回创建的顶层Actor地址,而不是Actor本身。这个地址成为ActorRef,ActorRef可用于向Actor发送消息。
ActorPath对应Actor位置,每个Actor有一个名字,这个名字在每个层次上应该是唯一的,不能有两个同名的兄弟Actor。(如果没有给Actor命名,则Akka会产生一个,不推荐!)所有Actor引用存放在ActorPath中,相对/绝对都可以。
ActorRef 与 邮箱
消息被发送到Actor的ActorRef。每个Actor有一个邮箱。ActorRef消息暂存在邮箱中,以备后续处理,按到达的顺序一次处理一个。
分发器
分发器将消息推送给Actor,分发器类型决定了使用哪种线程模型推送消息。当向某个Actor发送一条消息时,实际上所做的只是把这条消息放到邮箱的最后,最终分发器将把它推送给Actor。这个Actor又可以把一条消息放到下一个Actor邮箱的最后,并在某个>时间点进行推送。