Simple Akka: Akka Essentials - Introduction to Akka

简介

Akka是一个非常著名的角色模型框架(Actor Model),它提供一个完整基于JVM的工具和运行时用于设计运行高并发,分布式,高容错,事件驱动的应用.

背景

在我们深入Akka之前,让我们回头了解一下并发的概念在应用开发世界时如何演变的.应用总是被底层硬件资源的能力所限制.构建大型的,可扩展的,分布式的应用程序需要从应用所运行的硬件资源和编程语言所提供的并发支持来看.

微处理器演化

并发系统

基于容器的应用程序

Actor模型

Actor模型最早基于Erlang实现.从不同的方法解决并发,避免引起线程和锁的问题.在Actor模型中,所有的对象作为独立的计算进行建模,响应接收到的消息,各个对象之间没有共享状态.整个Actor模型基于如下原则:

  • 不变的消息用于actor之间的通信.actor之间不共享状态,即便是有共享也只能是关于消息的.actor控制了对状态的访问,没有其他对象可以访问到状态,这意味着没有共享的可变的状态.
  • actor有一个消息队列用于接收进来的消息.只有一个消息在同一时间通过队列接收然后通过actor处理.一个actor可以通过响应一个不可变的消息给其他actor或者创建一个新的actor集合或者更新自己的状态再或者指定下次接到消息时的计算逻辑来响应接收到的消息.
  • 消息通过异步的方式进行传送.发送者并不会等待消息被接收,发送动作会立即完成.任何一个actor可以给另一个actor发送消息,但不保证消息的到达和消息的处理顺序.
  • 消息的发送者和接收者是异步和解耦的,允许他们在不同的线程中执行.通过不同的线程执行,再加上没有共享状态,让actor能够提供并发且可伸缩的模型.

Akka框架

Akka框架使用actor模型的概念构建了一个事件驱动,支持并发,分布式可扩展的中间件系统框架.Akka框架提供了一系列特性:

  • 并发性,抽象了并发处理,支持程序员专注于业务逻辑.
  • 可扩展,异步消息传送支持应用构建于多核服务器.
  • 容错性,借用Erlang的概念构建了一个”let it crash”的容错模型,让程序能够尽快从错误中恢复.
  • 事件驱动的体系结构,异步的消息处理支持akka构建完美的事件驱动系统结构.
  • 事务支持,结合actor和软件事务内存实现事务,支持自动重试和回滚的原子消息.
  • 位置透明,对远程的actor和本地的actor处理方式一样,提供一个统一的编程模型和和多核分布式的计算需求.
  • APIs,同时支持java和scala.

Actor系统

Actor是一个响应消息的独立的并行的计算实体.在深入actor之前,我们需要了解整个系统中actor所起的作用.actor在一个巨大的设计方案中是一个最小的单元.并发程序根据各自不同的子任务拆分为单独的实体,每个参与者执行各自的不同任务,当所有执行者完成各自的任务后整体任务完成.

什么是Actor

Actor被建模为对一个对象的状态和行为的封装,actor中的消息存储在队列中然后actor从队列中取消息进行处理.
Actor可以通过消息的传送来改变状态和行为,这允许他们能过对传入的消息进行响应.

状态

actor对象保存了实例变量,一些状态值或者单纯的计算实体.这些状态可以是计数器,监听器,资源引用或状态机.演员改变状态用于响应消息.

行为

行为是响应接收到的消息后执行的计算逻辑.actor的行为可以包含对自身状态的修改,也可以对行文自身进行改变.

邮箱

每个actor都有一个邮箱,actor之间通过邮箱这个导线进行连接,接收方邮箱中消息的顺序基于发送方的发送顺序进行排列.Akka同时提供了多种邮箱的实现,可以基于业务进行选择.
Akka使用dispatchers来管理消息从邮箱到actors的处理,支持多种不同实现的dispatcher.

生命周期

每个actor的定义和创建都有一个完整的生命周期.Akka提供了preStart用于actor状态和行为的初始化.当actor停止的时候,akka会再PostStop调用之前禁用其消息队列,在postStop时可以做任何持续性或清理资源状态.

容错

位置透明

事务处理器