Akka和actor的相生相恋

本文介绍了Akka框架的基础概念,详细解析了Actor模型及其在Akka中的应用方式,并概述了Akka框架的优势及主要组成部分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我习惯于把一个问题分为三个步骤(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()
}

这样大概的一个例子就跑通啦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值