ruanchao

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

===================================================================================================

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识别出来,从而可以针对性地实现精细化调度及增强系统内核的稳定性。

 

 参考《架构解密-从分布式到微服务》

===================================================================================================

 

posted on 2021-06-06 13:49  ruanchao  阅读(504)  评论(0编辑  收藏  举报