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

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

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

什么是Actors

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

下面展开说。

1.消息 MESSAGING

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

要点:

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

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

2. 并发 CONCURRENCY###!

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

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

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

3.故障转移 FAILOVER

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

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

需要注意的:

  1. 需要有一个能做各种不同事情的Actor的后备池。
  2. 一个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」。转载请注明。

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

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

    原文:http://rerun.me/2014/10/21/akka-notes-child-actors-and-path/ Actor是完全的继承结构.你创建的任何Actor肯定都是一个其他Act ...

  2. [翻译]AKKA笔记 - LOGGING与测试ACTORS -2 (二)

    3.THROW IN A LOGBACK.XML 现在我们把SLF4J日志配置在logback. <?xml version="1.0" encoding="UTF ...

  3. [翻译]AKKA笔记 - LOGGING与测试ACTORS -2 (一)

    在前两章 ( 一 , 二 ) ,我们大致讲了Actor和message是怎么工作的,让我们看一下日志和测试我们的 TeacherActor . RECAP 这是上一节我们的Actor代码: class ...

  4. [翻译] AKKA笔记- ACTORSYSTEM (配置CONFIGURATION 与调度SCHEDULING) - 4(一)

    原文在http://rerun.me/2014/10/06/akka-notes-actorsystem-in-progress/ 像我们前面看到的,我们可以用ActorSystem的actorof方 ...

  5. [翻译]AKKA笔记 - 有限状态机 -1

    原文地址:http://rerun.me/2016/05/21/akka-notes-finite-state-machines-1/ 我最近有个机会在工作上使用了Akka FSM,是个非常有趣的例子 ...

  6. [翻译]AKKA笔记 -ACTOR SUPERVISION - 8

    失败更像是分布式系统的一个特性.因此Akka用一个容忍失败的模型,在你的业务逻辑与失败处理逻辑(supervision逻辑)中间你能有一个清晰的边界.只需要一点点工作,这很赞.这就是我们要讨论的主题. ...

  7. [翻译]AKKA笔记 - ACTOR MESSAGING - REQUEST AND RESPONSE -3

    上次我们看Actor消息机制,我们看到开火-忘记型消息发出(意思是我们只要发个消息给Actor但是不期望有响应). 技术上来讲, 我们发消息给Actors就是要它的副作用. 这就是这么设计的.除了不响 ...

  8. [翻译]AKKA笔记 - DEATHWATCH -7

    当我们说Actor生命周期的时候,我们能看到Actor能被很多种方式停掉(用ActorSystem.stop或ActorContext.stop或发送一个PoisonPill - 也有一个kill和g ...

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

    原文地址:http://rerun.me/2014/10/21/akka-notes-actor-lifecycle-basic/ (请注意这了讨论的生命周期并不包括 preRestart 或者pos ...

随机推荐

  1. HTML 学习记录

    <h1>This is a heading </h1> 标题 h后面的数字是字体大小 <p>This is a paragraph.</p>段落 < ...

  2. Hadoop streaming模式获取jobconf参数

    1. 像map_input_file这种环境变量是在hadoop-streaming.jar程序中设置的,所以无需-cmdenv map_input_file参数就可以在php中直接引用,如$var= ...

  3. 配置nginx负载均衡

    配置nginx负载均衡 执行命令:vi /usr/local/nginx/sbin/nginx/conf/nginx.conf 修改为: worker_processes  2; events {   ...

  4. 数位DP

    题意:(hdu 4734) 我们定义十进制数x的权值为f(x) = a(n)*2^(n-1)+a(n-1)*2(n-2)+...a(2)*2+a(1)*1,a(i)表示十进制数x中第i位的数字. 题目 ...

  5. 轻量级ORM框架 Dapper快速学习

    好在有师兄师姐一起带着做,所以开始没那么困难,但是由于大学涉猎范围有限,往往有很尴尬的时候,不懂构造方法重载,去“请教”,本来以为师兄会帮忙写好,结果“我念,你来写”,被深深的激励了一把,后来就早出晚 ...

  6. html给div加超链接的方法

    1.通过window.open函数 <div onclick="window.open('www.baidu.com')">在新窗口跳转至百度</div> ...

  7. Catia CAA 二次开发 ---- 开发准备(0)

    去年开始学习Catia CAA的二次开发,前后的间断性学习有1年吧. 现在已经好久没用,忘得也差不多了,原来的笔记都放在了Evernote,现在还是觉得边继续复习边总结一下,以后也比较好检索. 先吐槽 ...

  8. arduino 入手

    新买了个ardhuino 入门套件 1. Win7 Driver issue: Need to install the below drivers, because my windows is ins ...

  9. mottoes

    1. You don't kown if you can until a try. 2. Rule youself. 3. It's what you do in the dark that puts ...

  10. android5.0 aosp编译记录(由于机器硬件原因,改为4.4.2编译通过)

    编译环境必须是64位系统啊,妥妥的又装了64位的ubuntu,虚拟机推荐server版本,不带x省性能…… 接着要装openjdk 1.7,记得更新一下系统的源,下面这个不错 deb http://m ...