Actor模型-Akka
英文原文链接,译文链接,原文作者:Arun Manivannan ,译者:有孚
写过多线程的人都不会否认,多线程应用的维护是件多么困难和痛苦的事。我说的是维护,这是因为开始的时候还很简单,一旦你看到性能得到提升就会欢呼雀跃。然而,当你发现很难从子任务的错误中恢复或者有些僵尸BUG很难复现再或者你的分析器显示你的线程在写入一个共享状态前大部分时间都浪费在阻塞上面的时候,痛苦降临了。
我刻意没提Java的并发API,以及它里面的集合类使得多线程编程变得多么轻松简单,因为我相信既然你们点进了这篇文章,那就说明你希望能更好地控制你的子任务,或者你就是不喜欢使用锁以及同步块,希望能有一种更高层次的抽象。
在本系列的Akka笔记中,我们将通过一些简单的Akka例子来体验下它的诸多特性。
什么是Actor?
Akka中的Actor遵循Actor模型。
你可以把Actor当作是人。这些人不会亲自去和别人交谈。他们只通过邮件来交流。
我们来稍微解释下这点。
1. 消息传递
假设有两个人——一个聪明的老师和一个学生。学生每天早上都会发一封邮件给老师,而老师则会回复一句名言。
需要注意的地方:
1. 学生发送邮件。一旦发送成功,邮件不能再修改。这天然就具备了不可变性。
2. 老师会自己决定何时检查邮箱。
3. 老师还会回复一封邮件。
4. 学生会自己决定何时检查邮箱。
5. 学生不会一直等待回信(非阻塞的)。
这就可以总结出Actor模型的一个基本特征——消息传递。
2. 并发
现在,想像一下3个聪明的老师和3个学生——每个学生都会向所有老师分别发送笔记。这会发生什么?事实上没有任何改变。每个人都有自己的邮箱。这里有一点值得强调一下:
默认情况下,邮箱中的邮件是按它们到达的顺序进行处理的。
本质上这就是一个ConcurrentLinkedQueue](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentLinkedQueue.html)。由于没有人在等待邮件,这就是一个非阻塞的消息。(Akka[内置包含许多种邮箱实现,包括有界的以及基于优先级的)。事实上,我们自己也能开发一个。
3. 失败处理
想像下这三个老师是不同系的——历史,地理以及哲学。
历史老师对过去的某个事件进行了评论,地理老师则发送了一个很有意思的地方,而哲学老师回复了一句名言。每个学生都分别给各个老师发送邮件并收到回信。学生并不关心邮件到底是系里的哪个老师回复的。如果有一天有个老师生病了呢?系里至少得有一个老师在处理邮件才行。这样的话,系里的另一位老师就会顶上这项工作。
需要注意的地方:
1. 会有一个Actor的池,每个Actor会处理不同的事件。
2. Actor做的事情可能会抛出异常。它自己无法从中恢复。这种情况下,需要再生成一个新的Actor来顶替它。换句话说,这个新的Actor会忽略刚才那条消息,继续处理剩余的消息。这些也被称为指令(Directive),后面我们会再讲到它们。
4. 多任务
我们假设下每个老师都会通过邮件来发送考试成绩,如果学生这么要求的话。类似的,Actor也可能会处理多种类型的消息。
5. 消息链
那如果学生不想收到多封邮件,而是一封该怎么办呢?
Actor同样可以完成这个。我们可以将老师进行分层。后面我们讲到Supervisor和Future的时候会再回来讲下这点。
应Mohan的要求,我们把类比的实体和Actor模型中的组件做一下映射。

学生和老师都是我们的Actor。收件箱就是Mailbox组件。请求和响应是不可修改的。它们都是不可变对象。最后,Actor中的MessageDispatcher组件会管理邮箱并将消息路由到对应的Mailbox中。
Actor模型-Akka的更多相关文章
- Akka简介与Actor模型
Akka是一个构建在JVM上,基于Actor模型的的并发框架,为构建伸缩性强,有弹性的响应式并发应用提高更好的平台.本文主要是个人对Akka的学习和应用中的一些理解. Actor模型 Akka的核心就 ...
- Akka简介与Actor模型(一)
前言...... Akka是一个构建在JVM上,基于Actor模型的的并发框架,为构建伸缩性强,有弹性的响应式并发应用提高更好的平台.本文主要是个人对Akka的学习和应用中的一些理解. Actor模型 ...
- Scala并发编程模型AKKA
一.并发编程模型AKKA Spark使用底层通信框架AKKA 分布式 master worker hadoop使用的是rpc 1)akka简介 写并发程序很难,AKKA解决spark这个问题. akk ...
- 以Akka为示例,介绍Actor模型
许多开发者在创建和维护多线程应用程序时经历过各种各样的问题,他们希望能在一个更高层次的抽象上进行工作,以避免直接和线程与锁打交道.为了帮助这些开发者,Arun Manivannan编写了一系列的博客帖 ...
- 【Akka】Actor模型探索
Akka是什么 Akka就是为了改变编写高容错性和强可扩展性的并发程序而生的.通过使用Actor模型我们提升了抽象级别,为构建正确的可扩展并发应用提供了一个更好的平台.在容错性方面我们採取了" ...
- akka设计模式系列(Actor模型)
谈到Akka就必须介绍Actor并发模型,而谈到Actor就必须看一篇叫做<A Universal Modular Actor Formalism for Artificial Intellig ...
- 深入理解Akka Actor模型
Carl Hewitt 在1973年对Actor模型进行了如下定义:"Actor模型是一个把'Actor'作为并发计算的通用原语". Actor是异步驱动,可以并行和分布式部署及运 ...
- Akka并发编程——第五节:Actor模型(四)
本节主要内容: 1. 停止Actor 1. 停止Actor (1)通过ActorSystem.shutdown方法停止全部 Actor的执行 /* *停止Actor:ActorSystem.shutd ...
- .NET的Actor模型:Orleans
Orleans是微软推出的类似Scala Akka的Actor模型,Orleans是一个建立在.NET之上的,设计的目标是为了方便程序员开发需要大规模扩展的云服务, 可用于实现DDD+EventSou ...
随机推荐
- 163邮箱 SMTP发送邮件注意点
在之前163邮箱注册的时候默认开通SMTP服务的,之后需要自己手动开始. 在配置的时候服务器的地址固定 用户名称就是你的邮箱 密码需要注意的是有的是你邮箱的密码,如果不对需要填写你的授权码!
- 关于HTTP请求、Ajax请求,请求的同步和异步
使用了很长时间的Ajax请求了,一直都是在以异步的方式在使用.昨天听了一个讲座涉及到apache server,偶然想到了这Ajax请求和HTTP请求的一些区别和联系,就在网上好好搜了一顿,把搜到的结 ...
- vue项目在移动端(手机)调试
查了很长一段时间的资料才搞好. 感悟就是:原来那么简单呐. 首要条件:同一局域网下(大致理解为链接相同的wifi) 1:命令行运行 ipconfig 2: 得到ipv4值, 用该值替换localhos ...
- 纯干货!耗时1个月整理黑马程序员Java教程+笔记+配套工具
学习Java是不是很苦?找不到资料?不了解学习步骤?想要全面的线路图! 或者是找资料,前面免费,后面收费?工具软件要收费? 当当当~~今天就没有这个状态发生了!不信就证明给你看 1.学习路线图 2.J ...
- Hibernate Session总结
现在我们可以在 IDEA 下新建一个 Hibernate 项目,接着上次内容这次主要总结一下 Hibernate 的 Session,及其核心方法. Session 概述 Session 接口是 Hi ...
- arcEngine开发之加载栅格数据
加载数据思路 在Engine中加载各种各样的数据都是通过这样的格式 IWorkspaceFactory pWorkspace = new IWorkspaceFactory(); IWorkspace ...
- 关于eclipse的一些问题
解决Eclipse,MyEclipse出现An error has occurred,See error log for more details的错误 方法1. 在"开始"--& ...
- JaveScript基础(3)之正则表达式
1.创建正则表达式的两张方法: A.var reg=/pattern/; 注意:斜杠内不能加单引号或双引号 B.vae reg=new RegExp('pattern'); 注意:括号内要用单引号括 ...
- Codeforces Round #483 (Div. 2) C. Finite or not?
C. Finite or not? time limit per test 1 second memory limit per test 256 megabytes input standard in ...
- namespace------------https://www.cnblogs.com/linhaifeng/p/6657119.html
PHP支持两种抽象的访问当前命名空间内部元素的方法,__NAMESPACE__ 魔术常量和namespace关键字. 常量__NAMESPACE__的值是包含当前命名空间名称的字符串.在全局的,不包括 ...