Akka(一)

Akka

什么是Akka

Akka是一组用于构建高并发(highly concurrent),分布式(distributed),弹性(resilient),消息驱动(message-driven)的JAVA和SCALA应用的工具包。

为什么用Akka

  • 更简单的高并发实现
  • 弹性设计,自愈&容错
  • 高性能(单机处理5千万消息/秒),轻量级事件(1GB内存可创建250万actor)
  • 集群部署,分布式节点
  • 响应式编程,异步非阻塞事件驱动

Akka工作视图

image.png

上图是一个类似树状层次结构,ActorSystem的Top-Level层次结构,与Actor关联起来,称为Actor路径(Actor Path),不同的路径代表了不同的监督范围(Supervision Scope)。下面说明ActorSystem的监督范围:

  • “/”路径:通过根路径可以搜索到所有的Actor
  • “/user”路径:用户创建的Top-Level Actor在该路径下面,通过调用ActorSystem.actorOf来实现Actor的创建
  • “/system”路径:系统创建的Top-Level Actor在该路径下面

Actor

普通的并发编程方式

多线程方法调用


image.png

多线程调用栈


image.png

问题:
需要上锁,防止并发导致的数据错乱;
锁成本高,应用被阻塞,多cpu利用率低,死锁;
多线程管理和异常处理较麻烦;

事件驱动编程

Actor模型是一个并行计算(Concurrent Computation)模型,它把actor作为并行计算的基本元素来对待:为响应一个接收到的消息,一个actor能够自己做出一些决策,如创建更多的actor,或发送更多的消息,或者确定如何去响应接收到的下一个消息

Actor通过消息协作,而不是call method


image.png

image.png

Actor作为Akka最小的并发单元,充当了消息的执行者和信使,它包含什么:

  1. 收件箱(存储消息队列)
  2. 行为(状态,仅内部可变)
  3. 消息列表(待处理的任务)
  4. 地址

Actor生命周期

image.png


ActorSystem

在Akka中,一个ActorSystem是一个重量级的结构,他需要分配多个线程,所以在实际应用中,按照逻辑划分的每个应用对应一个ActorSystem实例

一个ActorSystem是具有分层结构(Hierarchical Structure)的:一个Actor能够管理(Oversee)某个特定的函数,他可能希望将一个task分解为更小的多个子task,这样它就需要创建多个子Actor(Child Actors),并监督这些子Actor处理任务的进度等详细情况,实际上这个Actor创建了一个Supervisor来监督管理子Actor执行拆分后的多个子task,如果一个子Actor执行子task失败,那么就要向Supervisor发送一个消息说明处理子task失败。需要知道的是,一个Actor能且仅能有一个Supervisor,就是创建它的那个Actor。基于被监控任务的性质和失败的性质,一个Supervisor可以选择执行如下操作选择:

  1. 重新开始(Resume)一个子Actor,保持它内部的状态
  2. 重启一个子Actor,清除它内部的状态
  3. 终止一个子Actor
  4. 扩大失败的影响,从而使这个子Actor失败

你可能感兴趣的:(Akka(一))