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中。

原文地址:https://www.cnblogs.com/barrywxx/p/10347626.html

时间: 2024-08-29 12:27:36

Actor模型-Akka的相关文章

Akka v2.4-ARTERY-M4,Actor 模型开发库

Akka v2.4-ARTERY-M4 发布了.Akka 是一个用 Scala 编写的库,用于简化编写容错的.高可伸缩性的 Java和 Scala 的 Actor 模型应用. 暂未发现该版本更新内容,点击下面链接保持关注更新: http://akka.io/news/ https://github.com/akka/akka/releases/tag/v2.4-ARTERY-M4 https://github.com/akka/akka/compare/v2.4-ARTERY-M4...mast

Akka并发编程——第七节:Actor模型(六)

主要内容: 1. Typed Actor定义 2. Typed Actor创建 3. 消息发送 1. Typed Actor定义 Akka中的Typed Actor是Active Objects设计模式的实现,Active Objects模式将方法的执行和方法的调用进行解耦合,从而为程序引入并发性.Typed Actor由公用的接口和对应实现两部分构成,其后面深层次的实现使用的是代理模式,即通过使用JDK中的动态代理来实现,在调用接口的方法时自动分发到实现接口的对象上.Typed Actor的定

Akka 4 akka的Actor模型

1. What is an Actor? The Actor Model represents objects and their interactions, resembling human organizations and built upon the laws of physics. is an object with identity has a behavior only interacts using asynchronous message passing 2. The Acto

.NET的Actor模型:Orleans

Orleans是微软推出的类似Scala Akka的Actor模型,Orleans是一个建立在.NET之上的,设计的目标是为了方便程序员开发需要大规模扩展的云服务, 可用于实现DDD+EventSourcing/CQRS系统. 传统的三层体系结构包括无状态的前端,无状态的中间层和存储层在可伸缩性方面是有限制的,由于存储层在延迟和吞吐量方面的限制,这对于每个用户请求都有影响.通常办法是在中间层和存储层之间添加缓存层来提高性能.然而,缓存会失去了大部分的并发性和底层存储层的语义保证.为了防止缓存和存

在.NET中实现Actor模型的不同方式

上周,<实现领域驱动设计>(Implementing Domain-Driven Design)一书的作者Vaughn Vernon,发布了Dotsero,这是一个使用C#编写的.基于.NET的Actor模型工具包,它的实现参考了Akka API.Akka工具包是对Actor模型的一种实现,目前为止已经有对应Java和Scala版本的API. 今年早些时候,微软Research部门也发布了一个基于Actor模型的框架,Orleans框架的预览版.这个框架采用了云端编程模型,编写这个框架的目的在

【Scala篇】--Scala中Trait、模式匹配、样例类、Actor模型

一.前述 Scala Trait(特征) 相当于 Java 的接口,实际上它比接口还功能强大. 模式匹配机制相当于java中的switch-case. 使用了case关键字的类定义就是样例类(case classes),样例类是种特殊的类. Actor相当于Java中的多线程. 二.具体阐述 trait特性 1.概念理解 Scala Trait(特征) 相当于 Java 的接口,实际上它比接口还功能强大. 与接口不同的是,它还可以定义属性和方法的实现. 一般情况下Scala的类可以继承多个Tra

Scala笔记整理(九):Actor和AKKA

[TOC] 概述 ? Scala的Actor有点类似于Java中的多线程编程.但是不同的是,Scala的Actor提供的模型与多线程有所不同.Scala的Actor尽可能地避免锁和共享状态,从而避免多线程并发时出现资源争用的情况,进而提升多线程编程的性能. Spark中使用的分布式多线程框架,是Akka,是Scala的一种多线程的类库.Akka也实现了类似Scala Actor的模型,其核心概念同样也是Actor.Scala Actor模型已经在2.1.0的时候还在用,但是在2.1.1的时候已经

Actor模型及原理

1.Actor模型 在使用Java进行并发编程时需要特别的关注锁和内存原子性等一系列线程问题,而Actor模型内部的状态由它自己维护即它内部数据只能由它自己修改(通过消息传递来进行状态修改),所以使用Actors模型进行并发编程可以很好地避免这些问题,Actor由状态(state).行为(Behavior)和邮箱(mailBox)三部分组成 状态(state):Actor中的状态指的是Actor对象的变量信息,状态由Actor自己管理,避免了并发环境下的锁和内存原子性等问题 行为(Behavio

Scala-Unit7-Scala并发编程模型AKKA

一.Akka简介 Akka时spark的底层通信框架,Hadoop的底层通信框架时rpc. 并发的程序编写很难,但是Akka解决了spark的这个问题. Akka构建在JVM平台上,是一种高并发.分布式.并且容错的应用工具包: Akka使用Scala语言编写,同时它提供了Scala和Java的开发接口,Akka可以开发一些高并发的程序. 二.Akka的Acor模型 A卡卡处理并发的方法基于actor模型,在基于actor的系统中,所有事物都是actor(类似于Java的万物皆对象): actor