博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
akka actor中的基本概念(学习小结)
阅读量:4583 次
发布时间:2019-06-09

本文共 2441 字,大约阅读时间需要 8 分钟。

注:本文章是看blog后的一个阶段小结,只作为个人笔记, 原文链接:

官网地址贴上: 

什么是akka

akka的actor模式提供了一个写并发和分布式系统的高层次抽象,将程序员从锁和线程管理等问题中解放出来,是一个在JVM上构建高并发、分布式和可快速恢复的消息驱动应用的工具集和运行时,actors 模式是在Carl Hewitt 1973的论文中定义的,最初是在 Erlang 语言中流行,Ericsson用它成功地实现了高并发高可靠的通讯系统。

 

什么是actor

我们这把Actors当作是一个人,这个人不会自己和其他的人直接说话,他们只通过mail来进行交流。
假设有两个人:学生和聪明的老师。学生每天早上都会给老师发送邮件,而聪明的老师都会回复一句名言。这里需要解释:
  1、学生发送邮件。一旦发送成功,邮件不能再修改。这天然就具备了不可变性;

  2、老师会自己决定何时检查邮箱;

  3、老师还会回复一封邮件(也是不可变的);

  4、学生会自己决定何时检查邮箱;

  5、学生不会一直等待回信(非阻塞的)

 

以“
消息
单向传递
为例说明消息传递的原理 

消息传递原理图:

 实现上述过程的代码如下:

object StudentSimulatorApp extends App{
 
  
//
Initialize the ActorSystem
  val actorSystem=ActorSystem(
"
UniversityMessageSystem
")
 
  
//
construct the Teacher Actor Ref
  val teacherActorRef=actorSystem.actorOf(Props[TeacherActor])
 
  
//
send a message to the Teacher Actor
  teacherActorRef!QuoteRequest
 
  
//
Let's wait for a couple of seconds before we shut down the system
  Thread.sleep (
2000)
 
  
//
Shut down the ActorSystem.
  actorSystem.shutdown()
 }

 

ActorSystem是进入Actor世界的切入点,通过ActorSystem你可以创建和停止Actors,甚至关掉整个Actor环境!另一方面,Actor是一个体系,ActorSystem类似于java.lang.Object or scala.Any,能够容纳所有的Actor!它是所有的Actor的父类。当你创建一个Actor,你可以用ActorSystem的actorOf方法。

 

ActorRef  是真实 Actor 的代理,客户端不直接和 Actor 进行通信,而将消息发送给Actor的代理,在此之后消息经过Dispatcher、MailBox到达真实Actor,而后面的这个过程我们在代码中不需要做任何实现 。这是Actor Model中的处理方式,该方式避免直接让问 Actor 或者任何Actor中的任何custom/private方法或者变量。

 

Dispatcher
做一些很有趣的事,Dispatcher仅仅是将message从ActorRef 传递到MailBox中,此外我们还需要知道,
Dispatcher 包装了一个 ExecutorService (ForkJoinPool 或者 ThreadPoolExecutor).而MailBox就运行在
ExecutorService之上,也就是说MailBox是由Dispatcher来运行的。

 

每个Actor都有一个MailBox(后面我们将看到一个特殊情况)。在我们之前的模型中,每个Teacher也有一个MailBox。Teacher需要检查MailBox并处理其中的message。MailBox中有个队列并以FIFO方式储存和处理消息。当MailBox的run方法被运行,它将从队列中取出消息,并传递到Actor进行处理,在目标Actor其实是个receive 方法。TeacherActor 是基本的类,并且拥有一系列的quote,很明显,receive 负责匹配各种request,并作出response,代码片段如下:

class
 TeacherActor extends Actor {
  val quotes = List(
    
"
Moderation is for cowards
",
    
"
Anything worth doing is worth overdoing
",
    
"
The trouble is you think you have time
",
    
"
You never gonna know if you never even try
")
  def receive = {
    
case QuoteRequest => {
      import util.Random
      
//
Get a random Quote from the list and construct a response
      val quoteResponse=QuoteResponse(quotes(Random.nextInt(quotes.size)))
      println (quoteResponse)
    }
  }
}

 

 Receive方法会接受到各种request,首先要做的是匹配到我们的QuoteRequest,然后从quotes中随机去除一个quote,然后构建一个QuoteResponse对象(我们可以通过这种消息发送的方式将quoteRequest发送给发送者,作为request 的 response)

 

转载于:https://www.cnblogs.com/key1309/p/5354724.html

你可能感兴趣的文章
App测试方法总结
查看>>
51nod-1228: 序列求和
查看>>
BZOJ1303: [CQOI2009]中位数图
查看>>
2015上海马拉松线上跑感悟-人生如同一场马拉松
查看>>
北航软院2013级C#期末考试部分考题解答
查看>>
CentOS 系统中安装 ArcGIS Server10.1 一些问题及解决
查看>>
asp.net里登陆记住密码
查看>>
【BZOJ】2190 [SDOI2008]仪仗队(欧拉函数)
查看>>
线性规划中的单纯形法与内点法(原理、步骤以及matlab实现)(一)
查看>>
简单DP【p2758】编辑距离
查看>>
Spring Data JPA:关联映射操作
查看>>
JWT入门简介
查看>>
结对编程——吐槽必应词典
查看>>
katalon系列八:Katalon Studio图片识别
查看>>
Spring操作指南-针对JDBC配置声明式事务管理(基于XML)
查看>>
sql server 调优----索引缺失
查看>>
spring + junit 测试
查看>>
.net core 无法获取本地变量或参数的值,因为它在此指令指针中不可用,可能是因为它已经被优化掉了...
查看>>
Poj2186Popular Cows
查看>>
TCP之listen&backlog
查看>>