高级并发:Akka Actors和JavaEE7的EJB比较

随着Facebook 190亿美金收购WhatsApp,其背后的Erlang语言受到关注,本质上Erlang的新型对象消息模型被抽象为Actors模型,作为Actors模型的Akka框架有Java和Scala两个版本,最近,Dr Gerald Loeefler在2014年LSUG大会发表了从Java并发的高级层次将Actors模型与Java EE7的Enterprise JavaBeans,特别是无状态的会话bean和JMS的消息驱动bean进行比较,它们之间是有共性。

作为一个高级集成架构师,应该在程序范式的高级层次定义并发,基于组件级别的并发,并且尽可能地避免涉及线程概念以及线程池等底层概念。

该谈话围绕了 Active Objects(活动对象)设计模式,从活动对象模式角度看,这两种并发组件模型有如下特点:

1. Akka Actors :接收任意对象的消息,通过邮箱排队方式。这些消息被一个公共接口被明确管理和定位

2.无态会话bean: 暴露异步方法,在应用服务器中执行,由容器管理其生命周期管理。

3.JMS消息Bean: 接受处理来自JMS queue/topic的消息. 这些消息是容器管理的,类似会话Bean

这三者的共性都是来自一个线程池的线程异步执行,能够依次访问同一个实例。

Gerald使用了三个模式总结这三个类型:
1.本地单向异步请求Local One-Way Asynchronous Request:
从请求者发送一个异步请求到应答者,应答者不会回应。

2.超越上下文的异步请求Request Asynchronous Out-of-Context Request ,请求者发送一个消息给响应者,响应者发回返回消息,当请求者接受到响应以后必须重新建立上下文。

3.上下文内的异步外请求Request Asynchronous In-Context Request 当返回消息被请求者接受后,当时的上下文也被保留下来。

具体Actors模型讲解:http://www.jdon.com/actors.html

点按标题查看该英文PDF,文档中使用Scala代码演示了Actors和无态Bean以及MDB的三种模式实现。

总结:三种方法都使用线程池,并能够垂直和水平缩放,重要的差异体现在:异常处理,主管策略和事务处理。

我个人认为Actor模型和EJB最大区别还是性能上面,由于EJB是由容器管理,事务安全都要管,相对要重量些,而Actor模型的事务安全都不在其管辖范围,当然也可以使用内存软事务实现事务安全,因此Actor模型要轻量些,可以适合更多应用场合,比如WhatsApp这种类似微信的聊天应用,是无需事务的,这样能够节省内存,一台服务器可以容纳更多用户的会话连接,节省额外开销。

如果说当初Spring使用IOC/AOP编程风格对EJB提出挑战,那只是针对使用者使用方式上革命,并没有在本质上完全能替代EJB,EJB在吸取IOC/AOP特点后,依然没有倒下。

如今Akka的Actor模型才是对传统EJB模型的致命一击,完全可以替代EJB全部,当初 Spring创始人Rod大叔已经在Scala公司,相信这位without EJB大师真正完成其without EJB的口号。