AKKA 是一款基于actor模型实现的并发处理框架。基于事件驱动的并发处理模型,每一个actor拥有自己的属性和操作,这样就避免了通常情况下因为多个线程之间要共享属性(数据)而是用锁机制的处理。这种机制在scala,cloure 语言中应用的很好,将操作和属性放在一个独立的单元中进行处理,从而提高并发处理的能力。
Akka的五大特性
1)易于构建并行和分布式应用 (Simple Concurrency & Distribution)
Akka在设计时采用了异步通讯和分布式架构,并对上层进行抽象,如Actors、Futures ,STM等。
2)可靠性(Resilient by Design)
系统具备自愈能力,在本地/远程都有监护。
3)高性能(High Performance)
在单机中每秒可发送50000000个消息。内存占用小,1GB内存中可保存2500000个actors。
4)弹性,无中心(Elastic — Decentralized)
自适应的负责均衡,路由,分区,配置
5)可扩展(Extensible)
1)易于构建并行和分布式应用 (Simple Concurrency & Distribution)
Akka在设计时采用了异步通讯和分布式架构,并对上层进行抽象,如Actors、Futures ,STM等。
2)可靠性(Resilient by Design)
系统具备自愈能力,在本地/远程都有监护。
3)高性能(High Performance)
在单机中每秒可发送50000000个消息。内存占用小,1GB内存中可保存2500000个actors。
4)弹性,无中心(Elastic — Decentralized)
自适应的负责均衡,路由,分区,配置
5)可扩展(Extensible)
可以使用Akka 扩展包进行扩展。
层次结构
和商业组织(比如公司)类型,Actors之间也具有层次结构,一个Actor可以负责程序的某个功能,可以需要把分配给它的任务分成更小的便于管理的小任 务。因此一个actor可以创建多个子Actor来完成这些小任务,并负责管理它们。每个Actor有且只有一个管理者(supervisor)。
Actor 系统的一个精髓是可以把一个复杂的任务分解成小的可以处理的问题。这样做的好处是不仅仅任务本身结构清晰,而且用来处理它的Actor的消息也可以很好的进行分析,如果某个Actor不能处理某些情况,它可以给它的管理员发送失败消息,请求帮助。这种逐级上报的结构支持在适当的层次来处理错误。
我们在定义一个Actor时最好符合下面一些规则:
1)Actors应当是一个好同事,高效的完成自身的问题而不给别的Actor造成不必要的麻烦和不过分占用资源。使用编程的术语来说,就是使用事件处理的方式来处理事件并返回结果。Actor不该阻塞某些外部实体(比如一个锁,网络端口)
2)不要在Actor之间传递可以变化的数据,因此优先使用状态不变的消息。
3)Actor可以保存某些状态,并定义了一些功能,这意味着不同时传递数据和处理这些数据的行为。
最上层的Actor应该是你处理错误的最核心的那一层,因此不要过多的创建最上层的Actor,优先考虑纯等级结构。
仔细管理阻塞操作
如果某些可能造成阻塞的操作无法避免,比如在需要等待某些外部条件发生时使线程进入睡眠状态(比如网络操作时),在处理这些情况下,你可能非常想使用Future来封装这些阻塞操作,但这种方法过于简单化,你可能很快发现瓶颈或者内存不足等现象。
这里给出一个可以用来解决这个问题的解决方案的不完全列表:
1)在一个actor中完成这个阻塞操作,并且确保使用一个线程池专门来完成这项操作。
2)使用一个Future来完成这个阻塞操作,给出可以同时处理这个操作的数目的上界。
3)使用一个Future来完成这个阻塞操作,并使用一个定义了上界的线程池。
4)专门定义一个线程来管理一组可能被阻塞的资源,然后在事件发生时由它给Actor分发消息。
Actors模型
Actor模型并非什么新鲜事物,它由Carl Hewitt于上世纪70年代早期提出,目的是为了解决分布式编程中一系列的编程问题。其特点如下:
系统中的所有事物都可以扮演一个Actor
Actor之间完全独立
在收到消息时Actor所采取的所有动作都是并行的,在一个方法中的动作没有明确的顺序
Actor由标识和当前行为描述
Actor可能被分成原始(primitive)和非原始(non primitive)类别
系统中的所有事物都可以扮演一个Actor
Actor之间完全独立
在收到消息时Actor所采取的所有动作都是并行的,在一个方法中的动作没有明确的顺序
Actor由标识和当前行为描述
Actor可能被分成原始(primitive)和非原始(non primitive)类别
很多开发语言都提供了原生的Actor模型。例如erlang,scala等
Actor,可以看作是一个个独立的实体,他们之间是毫无关联的。但是,他们可以通过消息来通信。一个Actor收到其他Actor的信息后,它可以根据 需要作出各种相应。消息的类型可以是任意的,消息的内容也可以是任意的。这点有点像webservice了。只提供接口服务,你不必了解我是如何实现的。 一个Actor如何处理多个Actor的请求呢?它先建立一个消息队列,每次收到消息后,就放入队列,而它每次也从队列中取出消息体来处理。通常我们都使得这个过程是循环的。让Actor可以时刻处理发送来的消息。
Actor消息
Actor发送消息方式
1)fire and forget方式:tell。
2)send and receive方式:ask。阻塞,会等待子actor返回Future。
在akka里,
Future表示一个异步的任务,这个异步任务的执行由system.dispatcher()得到的ExecutionContextExecutor执行。
scheduler表示一个调度任务。