akka框架原理分析

 

前言

akka框架是一个分布式高并发框架,基于actor模型开发,为想要使用actor模型的开发人员屏蔽了基本行为处理、actor生命周期管理、异常处理、网络通信等的细节,学习akka框架必须先了解actor模型。本文将简单介绍一下actor模型是什么,akka中actor实现的形式。

1. 什么是Actor模型?

局限点儿来回答这个问题比较容易理解,多线程(或进程,以下都用线程)并发编程时,线程间通信有两种方式:共享内存和消息传递。其中Java程序源熟悉的多线程通信方式就是共享内存的方式;而scala语言则是消息传递的方式,其具体的实现的方式就是Actor模型。

2. 共享内存 vs 消息传递

消息传递的方式比之共享内存更适应多核处理器,为什么这么说,我们可以从CPU使用率的方面来理解。在共享内存的模式下,发生数据竞争时,需要同步,或者可以说加锁,加锁的情况下就必然会导致某个线程要停止工作,这时为了不浪费该线程持有的CPU资源,处理方式是该线程保存自己的上下文信息,让出CPU给其他线程使用。其中保存和恢复上下文的工作是一段很浪费计算能力的操作,这在Actor模型中是不存在的,每个运行着的Actor都持续持有自己的CPU资源完成自己的工作。

3. Actor模型示意简图

akka框架原理分析_第1张图片

 更细节的示意图

akka框架原理分析_第2张图片

  1. message packed to be an envelope
  2. sender send it to dispathcer
  3. dispathcer dispatch envelope to recevier's mailbox
  4. mailbox holds a message queue to keep envelope in order 
  5. receiver process envelope from mailbox serially

4. actor对消息处理的行为能力

  • 改变自身的状态;
  • 发送消息(给其他actor);
  • 创建新的actor;

5. actor的层级体系

akka框架原理分析_第3张图片

 akka中的actor是树形结构存在的,每一个actor都有其父actor。root guardian,system guardian,user guardian是内置的actor,之所以叫做guardian是因为其承担着守护所有子节点的职责,root是所有actor的父节点,也必然是系统终止时最后一个停止的节点。对用户(使用akka的开发人员)而言,user guardian是需要关注的重点,所有用户创建的actor都是从user guardian这个父节点开始的。父子actor之间的关联关系,可以通过ActorRef对象(细节示意图可见)获取。

解释两个方法的使用:

  • system.actorOf() - 生成一个user guardian的子节点(actor);
  • context.actorOf() - 生成一个基于当前actor的子节点(actor);

 6. actor的生命周期

akka的actor体系是树形结构的,很自然的可以推断出父节点的生命周期影响着子节点的生命周期,即当父节点结束时所有子节点都会提前结束。这样设计的原因是树形结构的天然约束,带来的好处是资源管理的便捷。actor的结束方式大体可以分为两种:发送终止消息(需要用户设计actor时响应此类消息)、context.stop(actorRef)。akka也提供了类似spring bean生命周期管理的方法preStart()\postStop(),熟悉spring的开发人员很容易理解,此处不再详细解释。

7. 异常处理

这里也解释了为什么父节点会有guardian的叫法,起到了什么监护的作用。akka树形结构的actor体系,使得父节点可以接受到子节点异常崩溃时发送到父节点的异常信息,父节点可以决定如何处理子节点的异常(默认做法是停止异常子节点并重启)。

你可能感兴趣的:(Java)