我习惯于把一个问题分为三个步骤(1)xxx是什么?(2)xxx能做什么?(3)xxx是怎么做的?
1. Akka是什么
Akka是一个分布式异步并发框架,Akka使用Actor模型,Actor是一个异步、非阻塞的模型,基于事件驱动。可以简单的理解为,一
个Actor就像一个消息监听器,向actor发送一个消息之后就不用再管它,actor将异步处理消息。向多个不同的actor发送消息,actor
之间会并行处理消息,而不用你自己协调多个actor之间的并发调度问题。Akka的功能很多,目前我们只用到了它的异步处理功能,
更多应用场景期待大家慢慢探索。书写正确的并发,容错和可伸缩的应用程序是比较困难。大部分时间,这是因为我们使用了错误的
工具和错误的抽象水平。AKKA在这里改变这种状况,当程序的要求达到一台计算机的极限时,我们便需要将程序分布式化,让程序
运行在多台计算机上。akka提供了remote actor用来构建分布式应用。
Akka框架作为Akka是一个以Actor模型为基础构建的基于事件的并发编程框架,底层使用Scala语言实现,提供Java和Scala两种
API,它属于LightBend公司(原Typesafe公司)体系结构的一部分。
2. 那么actor是什么?
Actors 是一个非常轻的并发实例,基于事件驱动的异步信息处理,模式匹配是Actor处理信息的手段。它是对并发、锁、分布系统的
高度抽象。你只需要关注工作流。同时,actor是一个封装了状态和行为的对象,它们通过显式的传递消息来进行通信,这些消息会
被发送到它们收件箱中(消息队列)。某种意义上来说,actor 是面向对象编程中最严格的实现形式。为了更好的理解它们,我们可
以把这些actors看做一群人。想象一下,我们把一些子任务分给一群人,这些人根据其不同的职能划分为不同的组织机构。(这样
的好处就是我们不用与实际的人去打交道,而是直接面对部门整体。也不用花心思去考虑某一个人的情绪因素和职业道德了)。我们
在构建软件的时候其实也可以借鉴这种方式。每个actor都通过message交流,从自己的mailbox中读取别的actor发送的消息。
在使用Java语言进行并发编程时,需要特别关注共享的数据结构,线程间的资源竞争容易导致死锁等问题,而Actor模型便是要解决
线程和锁带来的问题,Actor是一种基于事件(Event-Based)的轻量级线程,在使用Actor进行并发编程时只需要关注代码结构,而
不需要过分关注数据结构,因此Actor最大限度地减少了数据的共享。 Actor由三个重要部分组成,它们是状态(state),行为
(Behavior)和邮箱(Mailbox),Actor与Actor之间的交互通过消息发送来完成,状态指的是Actor对象的变量信息,它可以是Actor
对象中的局部变量、占用的机器资源等,状态只会根据Actor接受的消息而改变,从而避免并发环境下的死锁等问题;行为指的是
Actor的计算行为逻辑,它通过处理Actor接收的消息而改变Actor状态;邮箱(mailbox)建立起Actor间的连接,即Actor发送消息
后,另外一个Actor将接收的消息放入到邮箱中待后期处理,邮箱的内部实现是通过队列来实现的,队列可以是有界的(Bounded)
也可以是无界的(Unbounded),有界队列实现的邮箱容量固定,无界队列实现的邮箱容易不受限制。
Actor模型是对现实世界的高度抽象,它具有如下特点:(1)Actor之间使用消息传递机制进行通信,传递的消息使用的是不可变消
息,Actor之间并不共享数据结构,如果有数据共享则通过消息发送的方式进行;(2) 各Actor都有对应的mailbox,如果其它Actor
向该Actor发送消息,消息将入队待后期处理;(3)Actor间的消息传递通过异步的方式进行,即消息的发送者发送完消息后不必等
待回应便可以返回继承处理其它任务。
3. akka能做什么?
actor系统的精华就是任务的分解。任务要被分割的要足够小,每个分片都会被委托给子actor。这里用到的思想很明显就是“分而治
之”,万变不离其宗啊!要想做好这一切,不仅仅要把任务组织的非常清晰(利于分解),也要对处理任务的最终actor在以下方面进
行考虑:哪些消息需要处理、如何正常的回应、如何处理失败等等。如果一个处理特定任务的actor失败了,它会向它的监督者发出
响应错误的消息去寻求错误处理的方法。这种递归式(监督者也有自己的监督者)的结构可以保证错误在合适的级别上进行处理。
Actor模式提供了并发及分布式系统的高度抽象。它使开发者很容易处理多线程及锁。
Actors提供给你:
1.并发和并行的简单和高层次的抽象。
2.异步,非阻塞和高性能的事件驱动编程模型。
3.非常轻量级的事件驱动的流程(约270万Actors每GB RAM)。
容错
“让崩溃”的语义通过管理节点实现容错。写优秀的高度容错的系统,实现从来没有停止,系统的自我修复。管理节点可以跨越多个JVM提供真正的容错系统。
位置透明性
一切的设计工作在一个分布式环境:所有Actors的互动,使用纯粹的消息传递和异步。
事务
STM(软件内存事务)与Actors混合在一起,形成Actorsr的事务。它可以让你组成原子的消息流,具有自动重试和回滚。
Akka框架意在简化高并发、可扩展及分布式应用程序的设计,它具有如下优势:
(1) 使用Akka框架编写的应用程序既可以横向扩展(Scale Out)、也可纵向扩展(Scale Up)。
(2) 编写并发应用程序更简单,Akka提供了更高的抽象,开发人员只需要专注于业务逻辑,而无需像Java语言那样需要处理底级
语义如线程、锁及非阻塞IO等。
(3) 高容错,Akka使用“let it crashes”机制,当Actor出错时可以快速恢复。
(4) 事件驱动的架构,Akka中的Actor之间的通信采用异步消息发送,能够完美支持事件驱动。
(5) 位置透明,无论是Actor运行在本地机器还是远程机器上,对于用户来说都是透明的,这极大地简化了多核处理器和分布式系
统上的应用程序编程。
(6) 事务支持能力,支持软件事务内存(software transactional memory,STM),使Actor具有原子消息流的操作能力。
Akka框架由下列十个组件构成:
(1) akka-actor :包括经典的Actor、Typed Actors、IO Actor等
(2) akka-remote:远程Actor
(3) akka-testkit:测试Actor系统的工具箱
(4) akka-kernel :Akka微内核,用于运行精简的微型应用程序服务器,无需运行于Java应用服务器上。
(5) akka-transactor :Transactors 即支持事务的 actors,集成了Scala STM
(6) akka-agent – 代理, 同样集成了Scala STM
(7) akka-camel – 集成Apache Camel
(8) akka-zeromq – 集成ZeroMQ 消息队列
(9) akka-slf4j – 支持SLF4J 日志功能
(10) akka-filebased-mailbox – 支持基于文件的mailbox
4,Akka是怎么做的
首先创建一个类
package com.pinganfu.cbscore.biz.akka.actor import akka.actor.{Actor, ActorSystem, Props} import org.springframework.context.annotation.Scope import org.springframework.stereotype.Component @Component("fileProcessActor") @Scope("prototype") class TestAkkaActor extends Actor { override def receive = { case num: Int => println("num is" + num) case str: String => println("str is" + str) case _ => println("unknown is" + _) } }
注意Scope必须是prototype,不能是单例的
接下来再创建
package com.pinganfu.cbscore.biz.akka.actor import akka.actor.{ActorSystem, Props} class TestActor extends App{ def receive = { case num: Int => println("num is" + num) case str: String => println("str is" + str) case _ => println("unknown is" + _) } //创建actor对象 var actor = ActorSystem("student") //创建myactor,指定actor名字为myactor var myactor = actor.actorOf(Props[TestAkkaActor], name = "myactor") //发送消息 myactor!123 //关闭程序 actor.shutdown() }
这样大概的一个例子就跑通啦