actor 模型是 1973 年就提出的一个分布式并发编程模型,在 erlang 语言中得到广泛支持和应用。目前 java中 也出现了很多支持 actor模型的库:akka、killim、jetlang等等,其中 akka 是使用 scala 写的,有 scala 和 java 两套使用接口;killim 需要对编译出来的 class 文件进行后处理。
最近项目需要架构整改,以支撑后续的发展,正在考虑是否采用 actor 模型。
- actor 模型有什么优点和缺点?
- actor 模型和 ACE reactor(反应堆)有什么异同?
- actor 模型和 proactor 模型有什么异同?
- actor 模型对大型分布式并发开发有什么好处?
- tumblr 说其底层的 RPC 框架 finagle 最初是基于 actor 模型的,后来为什么不用了?http://www.acejoy.com/thread-4065-1-1.html 英文原文:http://highscalability.com/blog/2012/2/13/tumblr-architecture-15-billion-page-views-a-month-and-harder.html
先收集点资料,这两天好好分析一下。
actor 模型参考维基百科定义(http://en.wikipedia.org/wiki/Actor_model):
actor 是一个计算实体,当其收到消息时,可以并发执行如下操作:
- 发送有限数量的消息给其他 actor
- 创建有限数量的新 actor
- 指定收到下一消息时的行为
ACE 的 reactor 模型是通过注册/回调方式进行驱动的程序开发模式,先注册自己关注什么事件,然后反应堆就会在该事件发生时回调你。这实际上与 actor 模型有些类似。reactor 在维基百科定义如下(http://en.wikipedia.org/wiki/Reactor_pattern):
reactor 是一种设计模式,用于一到多个输入并发向一个服务处理器发送请求时进行事件处理。服务处理器将收到的请求同步分发到相应的请求处理器上。
按照定义,所有 reactor 系统都是单线程的,但可以应用到多线程环境中。reactor 模型的特点是控制流反转(inversed flow of control)
proactor 模型可以认为是 reactor 模型的一种异步实现,reactor 要求收到请求后同步分发的请求处理器上,而 proactor 允许异步处理,定义(http://en.wikipedia.org/wiki/Proactor_pattern):
proactor 也是事件处理的设计模式,在这种模式中,长时间运行的活动在单独的异步过程中处理,异步处理过程技术后,一个 completion handler 被调用。这个有些类似 akka actor 模型中,future 对象的 onComplete、onSuccess、onFailed 方法。
proactor 的 ace 实现(http://www.cs.wustl.edu/~schmidt/PDF/proactor.pdf)
线程为啥不好?为啥要用event代替?http://www.stanford.edu/~ouster/cgi-bin/papers/threads.pdf
scala 的好书(programming in scala)http://www.cs.uwaterloo.ca/~brecht/courses/854-Scalable-Systems-Software/Possible-Readings/scala/ProgrammingInScala.pdf