===================================================================================================
Actor模型的理念:
所有对象皆是Actor,Actor之间仅通过Message Passing来通信,所有操作都是异步的,使得整个系统获得大规模的并发能力。
Actor消息内容,一般包括几个主要属性:
- source:发送方
- subject:主题,表明消息类型。
- data:消息内容。
Actor收到消息之后,可以做的处理:
- 创建其他Actor
- 向其他Actor发送消息
- 指定下一条消息到来的行为,例如修改自己的状态
基于Actor构建一个分布式应用程序,一般有一个Root Actor,然后多个Worker Actor。 例如:
- 有10个文件要处理;先创建一个Root Actor,然后Root Actor创建10个Worker Actor,每个Worker Actor处理1个文件。
- Root Actor要给Worker Actor发送一个消息,消息中包含分配给它的文件编号。
- Worker Actor计算完成之后,返回结果给Root Actor,由Root Actor汇总和输出。
- Root Actor要监控Worker Actor的状态,并进行处理,例如重新拉起一个新的Worker Actor。
Actor模型的优势:
- 消息收发、线程调度、同步等所有复杂逻辑,都交给Actor框架。 开发者只需要关心Actor之间的消息即可,而且Actor也可以很容易地单独测试。
Actor模型的劣势:
- Actor完全避免了数据共享,使得程序员失去精细化并发优化的能力,所以不太适合实施细粒度的并行,且可能导致系统响应时延的增加。如果在Actor程序中在引入一些并行框架,就可能导致系统的不确定性。Actor程序的性能,取决于Actor框架的底层实现,包括调度、消息传输和网络等等。
- 尽管Actor模型程序,比“线程+锁”模型的程序更容易调试,但是还是会有死锁这类共性问题,还有一些Actor特有问题,例如消息队列溢出。
===================================================================================================
Akka:
对并行程序的简单的高层的抽象;
异步非阻塞、高性能的事件驱动的编程模型;
非常轻量的事件驱动处理(1G内存可容纳270万个Actors)。
Akka Actor分为user和system两种:
Akka的每个Actor都有一个Path,ActorSystem要维护一个Actor命名空间,具体做法参考了Linux Kernel的文件系统,顶层Actor是根路径/,然后下面分别是user和system两个子路径,把user空间和system空间分离,将system actor识别出来,从而可以针对性地实现精细化调度及增强系统内核的稳定性。
参考《架构解密-从分布式到微服务》
===================================================================================================