首页 > 代码库 > Actor_更轻量化的并发处理模型
Actor_更轻量化的并发处理模型
Actor_更轻量化的并发处理模型
JAVA在JDK5之前写并发程序是非常麻烦的,你要么继承Thread类,要么实现Runnable接口,同步机制的力粒度也很粗。JDK5之后,引入了Concurrent包,增加了很多并发特性的支持,如Callable<T>接口,可以使用Future<T>来获取每个任务返回的结果,而原来的Runnable是没有这个能力的。还有就是更细粒度的锁,如Lock接口。
Actor Model最早是在上世纪70-80年代就被提出来了,是用来编写并行计算或分布式系统的高层次抽象,让程序员不必为多线程模式下共享锁而烦恼, Erlang 最先实现Actor Model,SCALA参考了这个实现。
Actors将状态和行为封装在一个轻量的进程/线程中,但是不和其他Actors分享状态,每个Actors有自己的封闭环境,当需要和其他Actors交互时,通过发送事件和消息,发送是异步的,非堵塞的(fire-and-forget),发送消息后不必等另外Actors回复,也不必暂停,每个Actors有自己的消息队列,进来的消息按先来后到排列,这就有很好的并发策略和可伸缩性,可以建立性能很好的事件驱动系统。
SCALA实现Actor Model有两种实现方式:
基于线程的实现:类似JAVA中的thread方式,通过定义一个thread-specific方法(Scala中的Actor类的actor方法/JAVA中的Thread类的run方法),将一个线程和actor绑定;
基于事件的实现:通过定义一个线程池和一系列的事件处理函数,将事件处理函数作为actor方法,实现多个actor共享一个线程池;
通常情况下两种实现模型各有自己的优缺点,线程模型简单易用,但效率不高;而事件模型高效但难于设计。为了适应这两种模型,Scala的Actor库实现了两个不同操作:receive和react,两个操作都是试图从actor的邮箱中提取消息,然后通过模式匹配的方式调用处理函数,但是receive是基于线程模型的,而react是基于消息模型的。
AKKA平台是TypeSafe发布并维护的轻量级Actor框架,相对于SCALA原生定义的Actor,其具有如下的特点:
1.更加简单的并发策略Simpler Concurrency,通过Actors STM & Transactors能够简化编写可靠的并行计算。
2.EDA架构Event-driven Architecture,完美的异步事件驱动架构,不会堵塞。
3.真正的可伸缩性,使用异步消息在多核以及多个节点之间扩展。
4.容错性,重视失败。Let it crash!
5.远程透明性,底层可以使用NETTY或是THRIFT来通讯
6.集群管理能力,Cluster机制是AKKA20后提供的新功能
AKKA系统特别适合在云端或是基于多刀片系统的分布式计算,具有很强的Scale out的能力。
Actor_更轻量化的并发处理模型