Akka 实践(一)Akka基础

来源:互联网 发布:韩国真实社会现状 知乎 编辑:程序博客网 时间:2024/06/05 04:08

一、Akka是什么,解决什么问题

系统开发中,软件开发工程师经常面对的困难是高并发处理,高并发处理模块的好坏往往决定了系统的好坏。Akka就是一个基于事件驱动模型的高并发处理框架。Akka基于actor模型来实现高并发处理,每一个actor拥有自己的属性和操作,这样就避免了通常情况下因为多个线程之间要共享属性(数据)而是用锁机制的处理。这种机制在Scala,cloure 语言中应用的很好,将操作和属性放在一个独立的单元中进行处理,从而提高并发处理的能力。   

 从上面描述中,我们可以大致看出AKKA解决什么问题
1、高并发的调用
2、提供了角色,并对并发处理提供了高级抽象
3、避免了传统的锁机制
4、事件驱动模型
  
   现在比较正规的介绍Akka:Akka 是一个用 scala 编写的库,用于简化编写容错的、高可伸缩性的 Java 和 Scala 的 Actor 模型应用。它分为开发库和运行环境,可以用于构建高并发、分布式、可容错、事件驱动的基于JVM的应用。使构建高并发的分布式应用更加容易。 

Akka可以以两种不同的方式来使用 :
1、以库的形式:在web应用中使用,放到 WEB-INF/lib 中或者作为一个普通的Jar包放进classpath。 
2、以微内核的形式:你可以将应用放进一个独立的内核

二、Akka的原理

2.1 Actor模型

Actor这个模型由Carl Hewitt在1973年提出,Gul Agha在1986年发表技术报告“Actors: A Model of Concurrent Computation in Distributed Systems”,至今已有不少年头了。在计算机科学中,它是一个并行计算的数学模型,最初为由大量独立的微处理器组成的高并行计算机所开发,Actor模型的理念非常简单:天下万物皆为Actor。

Actor之间通过发送消息来通信,消息的传送是异步的,通过一个邮件队列(mail queue)来处理消息。每个Actor是完全独
立的,可以同时执行它们的操作。每一个Actor是一个计算实体,映射接收到的消息到以下动作:

1、发送有限个消息给其它Actor;
2、创建有限个新的Actor;
3、为下一个接收的消息指定行为。
  以上三种动作并没有固定的顺序,可以并发地执行。Actor会根据接收到的消息进行不同的处理。在一个Actor系统中,包含一个未处理的任务集,每一个任务由以下三个属性标识:
1、tag:用以区别于系统中的其它任务;
2、target:通信到达的地址;
3、communication:包含在target上的Actor处理任务时可获取的信息,。
   简单起见,可以把一个任务视为一个消息,在Actor之间传递包含以上三个属性的值的消息。Actor模型有两种任务调度方式:基于线程的调度以及基于事件的调度:
基于线程的调度:为每个Actor分配一个线程,在接收一个消息时,如果当前Actor的邮箱(mail box)为空,则会阻塞当前线程。基于线程的调度实现较为简单,但线程数量受到操作的限制,现在的Actor模型一般不采用这种方式;
基于事件的调试:事件可以理解为上述任务或消息的到来,而此时才会为Actor的任务分配线程并执行。
   综上,我们知道可以把系统中的所有事物都抽象成一个Actor:
1、Actor的输入是接收到的消息。
        2、Actor接收到消息后处理消息中定义的任务。
        3、Actor处理完成任务后可以发送消息给其它的Actor。
  那么在一个系统中,可以将一个大规模的任务分解为一些小任务,这些小任务可以由多个Actor并发处理,从而减少任务的完成时间。AKKA采用actor 模型来让开发者不需要关注太多并发,同步问题。AKKA基于jvm运行,底层是摆脱不了线程池运行,akka也少不了线程池大小配置的烦恼。但是Actor与thread不是一个维度的事情,Actor比thread更抽象,更偏上层,它只是定义了一种机制。
Actors 是一些包含状态和行为的一些对象。它们通过显式的传递消息来进行通信,这些消息会被发送到它们收件箱中(消息队列)。某种意义上来说,actor 是面向对象编程中最严格的实现形式。为了更好的理解它们,我们可以把这些actors看做一群人。想象一下,我们把一些子任务分给一群人,这些人根据其不同的职能划分为不同的组织机构。(这样的好处就是我们不用与实际的人去打交道,而是直接面对部门整体。也不用花心思去考虑某一个人的情绪因素和职业道德了)。我们在构建软件的时候其实也可以借鉴这种方式。

2.2 Akka的Actor


这里有三个角色:Client、Master、Worker 

Client傻乎乎地发同步请求给Master,一直等到结果返回客户端才离开。

Master接收客户端发来的请求,然后将请求交给Worker处理,处理完成之后将结果返回给Client。 

Worker负责具体的业务处理,它耗费的事件比较长。

所以这里的关键在于Master,如果Master线性地“接收请求――调用Worker处理得到返回结果――将结果返回”,这样的系统必将歇菜。使用Akka可以方便地将它变成并行地。

三、Akka的应用领域

1、事务处理(在线游戏,金融、银行,贸易,统计,博彩,社会化媒体,电信)
2、后端服务 (任何行业,任何应用)
3、并发/并行性(任何应用)
4、虚拟仿真
5、批处理(任何行业)
6、通讯枢纽(电信、网络媒体、移动媒体)
7、游戏与博彩(MOM(消息中间件),网络游戏,博彩)
8、商业智能/数据挖掘/通用运算
9、复杂的事件流处理

原创粉丝点击