翻译:AKKA笔记 - 介绍Actors

任何以前做过多线程的人都不会否认管理多线程程序是困难并且痛苦的。 我说管理是因为它开始很容易而且当你看到性能提升时会很兴奋。但是,当你看到你没法从子线程的错误中恢复 或者 这些僵尸bug很难重现 或者 当用性能剖析器时你发现你的线程在更新一个共享状态时阻塞了很长时间时,那真的很痛苦。

我倾向于不说Java的并发API和集合把并发编程变的更轻松和容易了,因为如果你看到这,你肯定渴望对子线程任务有更多控制或者希望更简单但又不愿意去写一堆的锁和同步代码块,而且希望对这种模式有更高层的抽象。

着这个Akka笔记里,我们会将Akka的例子过一遍并且看看这个工具箱里的各种特性。

什么是Actors

直接把Actors想象成人,人与人之间不直接说话,人们通过邮件来交流。

下面展开说。

1.消息 MESSAGING

想象有两个人 - 一个有智慧的老师和一个学生。 学生每天早上发邮件给老师,老师则回复一条妙语。

要点:

1.学生发一个邮件。一旦发出,邮件不能被编辑。这叫做不可变性。
2.老师在任何他喜欢的时间检查邮箱。
3.老师会发回一个邮件(也是不可变的)。
4.学生自由的检查自己的邮箱。
5.学生不会等待回复(没有阻塞)。

以上基本上解释了Actor模型的最基本模块 - 传递消息。

2. 并发 CONCURRENCY

现在,想象有三个老师和三个学生 -每个学生都给每位老师发邮件。那现在有什么事情发生了呢?没啥变化。每个人都有他们自己的邮箱。有一点需要记一下:

默认规则是邮箱里的邮件是按照接收的顺序来阅读/处理

内部实现默认是用ConcurrentLinkedQueue。并且因为没有人等待捡邮箱里的邮件,这是一个简单的非阻塞消息。(有很多内置的邮箱,事实上我们甚至能自己实现一个)

3.故障转移 FAILOVER

想象三个老师来自不同的系 - 历史系,地理系和哲学系

历史老师会对过去的事情进行回复,地理老师会发出一个有趣的地方,哲学老师回复一个格言。每个学生会给每个老师发邮件(消息)并且得到回复。学生并不关心是系里的哪个老师发的回复。如果某一天老师生病了呢?必须至少有一个系里的老师来处理这些邮件(消息)。这时,必须有另一个老师顶替上来处理邮件。

需要注意的:

需要有一个能做各种不同事情的Actor的后备池。
一个Actor有可能在处理消息时出现问题。他也不能进行自我恢复。这种情况发生时会有一个新的Actor被创建并且取代老的Actor。一个可选的做法是,Actor可以忽略那个有问题的消息并且直接处理其他还没处理的消息。这种方式叫Directives,我们稍后再说。
4.多任务 MULTITASKING

我们假设老师还会在学生询问的时候用邮件回复考试分数。同样的,Actor可以处理多种类型(type)的消息。

5.串联 CHAINING

如果学生希望拿到一个完整的将三份消息串在一起的邮件而不是三份邮件呢?

我们的Actor仍然可以这么做。我们可以把老师串成一个继承的层次结构。当我们谈到Supervisor和Future时我们还是回到这里。

现在让我们用Actor模型来类推一下这个组件。

学生和老师就是我们的Actors。邮箱就是Mailbox组件。请求和回复都不能被更改。他们是不可变(immutable)对象。最后,Actor中的MessageDispatcher组件是用来管理邮箱并且把消息路由到目标邮箱。

这是我翻译的文章,原文在http://rerun.me/2014/09/11/introducing-actors-akka-notes-part-1/



文章来自微信平台「麦芽面包」,微信号「darkjune_think」。转载请注明。

时间: 2024-10-26 05:34:22

翻译:AKKA笔记 - 介绍Actors的相关文章

[翻译]AKKA笔记 - CHILD ACTORS与ACTORPATH -6

原文:http://rerun.me/2014/10/21/akka-notes-child-actors-and-path/ Actor是完全的继承结构.你创建的任何Actor肯定都是一个其他Actor的child. 让我们分析下: PATH 我们用ActorSystem.actorof创建一个ActorRef并打印出他的path val actorSystem=ActorSystem("SupervisionActorSystem") val actorRef=actorSyste

[翻译]AKKA笔记 - ACTOR生命周期 - 基本 -5

原文地址:http://rerun.me/2014/10/21/akka-notes-actor-lifecycle-basic/ (请注意这了讨论的生命周期并不包括 preRestart 或者postRestart方法,当我们讨论supervision时候我们会说这个) 基本的Actor生命周期很直观.除了一点小不同,你可以直接拿基本Actor生命周期与Java Servlet生命周期作比较. 像其他常规类一样,我们有一个构造函数. preStart方法会被调用. 这里你可以在postStop

[翻译]AKKA笔记 - DEATHWATCH -7

当我们说Actor生命周期的时候,我们能看到Actor能被很多种方式停掉(用ActorSystem.stop或ActorContext.stop或发送一个PoisonPill - 也有一个kill和gracefulstop). 无论Actor是怎么死的,有些情况一些系统中的其他actor想要知道.让我们举一个Actor与数据库交互的例子 - 我们叫它RepositoryActor.很明显,会有一些其他actor会向这个RepositoryActor发送消息.这些有"兴趣"的Actor很

翻译:AKKA笔记 - Actor消息 -1(一)

从第一篇Akka笔记的介绍中,我们是从很高的高度去观察Akka工具箱中的Actors.在这篇笔记的第二篇,我们会看一下Actors中的消息部分.而且延续上一次的例子,我们还会使用同样的学生与老师的例子. 在Actor消息的第一部分,我们会建立一个Teacher Actor,而且会使用一个叫StudentSimulatorApp的主程序. 回顾学生-老师模式的细节 现在考虑下StudentSimulatorApp单独发消息给TeacherActor.当我说到StudentSimulatorApp,

Akka笔记之消息传递

英文原文链接,译文链接,原文作者:Arun Manivannan ,译者:有孚 在Akka笔记第一篇的介绍中,我们大致介绍了下Akka工具箱中的Actor.在第二篇当中,我们来看一下Actor消息传递的功能.这里还是延用之前使用的那个学生-老师的例子. 在Actor消息的第一部分中,我们会创建一个老师的Actor,但学生Actor则先不创建,而是使用一个叫做StudentSimulatorApp的主程序. 仔细回顾下学生-老师模型 我们现在只考虑StudentSimulatorApp发送给Tea

Akka笔记之Actor简介

英文原文链接,译文链接,原文作者:Arun Manivannan ,译者:有孚 写过多线程的人都不会否认,多线程应用的维护是件多么困难和痛苦的事.我说的是维护,这是因为开始的时候还很简单,一旦你看到性能得到提升就会欢呼雀跃.然而,当你发现很难从子任务的错误中恢复或者有些僵尸BUG很难复现再或者你的分析器显示你的线程在写入一个共享状态前大部分时间都浪费在阻塞上面的时候,痛苦降临了. 我刻意没提Java的并发API,以及它里面的集合类使得多线程编程变得多么轻松简单,因为我相信既然你们点进了这篇文章,

Akka笔记之日志及测试

英文原文链接,译文链接,原文作者:Arun Manivannan ,译者:有孚 在前两篇笔记中(第一篇,第二篇),我们简单地介绍了一下Actor以及它的消息传递是如何工作的.在本篇中,我们将看下如何解决TeacherActor的日志打印及测试的问题. 简单回顾 前面我们的Actor是这样的: class TeacherActor extends Actor { val quotes = List( "Moderation is for cowards", "Anything

ViewState 剖析(翻译兼笔记)

笔记 ViewState 不是什么? 1. ViewState 不是用来恢复回发的控件的值.这个是通过匹配 form 中该控件的变量名而自动完成的.这个只对 Load 事件加载之前创建的控件有效.2. ViewState 不会自动重新创建任何通过代码动态创建的控件.3. 不是用来保存用户信息的.仅仅保存本页的控件状态,而不能在页面之间传递. ViewState 是什么? ViewState 用来跟踪和保存控件的状态信息.否则这些信息可能会丢失,原因可能是这些值不随着 form 回发,或者根本就不

Akka笔记之请求与响应

英文原文链接,译文链接,原文作者:Arun Manivannan ,译者:有孚 前面我们讲到了Actor的消息传递,并看到了如何发送一条fire-n-forget消息(也就是说,消息发送给Actor后我们就不管了,不从Actor那接收响应). 技术上来讲,消息发送给Actor就是希望能有副作用的.设计上便是如此.目标Actor可以不做响应,也可以做如下两件事情-- 1. 给发送方回复一条响应(在本例中,TeacherActor会将一句名言回复给StudentActor) 2. 将响应转发给其它的