`
deepinmind
  • 浏览: 450962 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
1dc14e59-7bdf-33ab-841a-02d087aed982
Java函数式编程
浏览量:41568
社区版块
存档分类
最新评论

Akka笔记之Actor简介

阅读更多

写过多线程的人都不会否认,多线程应用的维护是件多么困难和痛苦的事。我说的是维护,这是因为开始的时候还很简单,一旦你看到性能得到提升就会欢呼雀跃。然而,当你发现很难从子任务的错误中恢复或者有些僵尸BUG很难复现再或者你的分析器显示你的线程在写入一个共享状态前大部分时间都浪费在阻塞上面的时候,痛苦降临了。

 

我刻意没提Java的并发API,以及它里面的集合类使得多线程编程变得多么轻松简单,因为我相信既然你们点进了这篇文章,那就说明你希望能更好地控制你的子任务,或者你就是不喜欢使用锁以及同步块,希望能有一种更高层次的抽象。

 

在本系列的Akka笔记中,我们将通过一些简单的Akka例子来体验下它的诸多特性。

 

什么是Actor?

Akka中的Actor遵循Actor模型。

你可以把Actor当作是人。这些人不会亲自去和别人交谈。他们只通过邮件来交流。

我们来稍微解释下这点。

 

1. 消息传递

假设有两个人——一个聪明的老师和一个学生。学生每天早上都会发一封邮件给老师,而老师则会回复一句名言。

需要注意的地方:

  1. 学生发送邮件。一旦发送成功,邮件不能再修改。这天然就具备了不可变性。
  2. 老师会自己决定何时检查邮箱。
  3. 老师还会回复一封邮件。
  4. 学生会自己决定何时检查邮箱。
  5. 学生不会一直等待回信(非阻塞的)。

这就可以总结出Actor模型的一个基本特征——消息传递。

消息传递

2. 并发

现在,想像一下3个聪明的老师和3个学生——每个学生都会向所有老师分别发送笔记。这会发生什么?事实上没有任何改变。每个人都有自己的邮箱。这里有一点值得强调一下:

默认情况下,邮箱中的邮件是按它们到达的顺序进行处理的。

本质上这就是一个ConcurrentLinkedQueue。由于没有人在等待邮件,这就是一个非阻塞的消息。(Akka内置包含许多种邮箱实现,包括有界的以及基于优先级的)。事实上,我们自己也能开发一个。

多人间的消息传递

3. 失败处理

想像下这三个老师是不同系的——历史,地理以及哲学。

历史老师对过去的某个事件进行了评论,地理老师则发送了一个很有意思的地方,而哲学老师回复了一句名言。每个学生都分别给各个老师发送邮件并收到回信。学生并不关心邮件到底是系里的哪个老师回复的。如果有一天有个老师生病了呢?系里至少得有一个老师在处理邮件才行。这样的话,系里的另一位老师就会顶上这项工作。

需要注意的地方:

  1. 会有一个Actor的池,每个Actor会处理不同的事件。
  2. Actor做的事情可能会抛出异常。它自己无法从中恢复。这种情况下,需要再生成一个新的Actor来顶替它。换句话说,这个新的Actor会忽略刚才那条消息,继续处理剩余的消息。这些也被称为指令(Directive),后面我们会再讲到它们。

4. 多任务

我们假设下每个老师都会通过邮件来发送考试成绩,如果学生这么要求的话。类似的,Actor也可能会处理多种类型的消息。

5. 消息链

那如果学生不想收到多封邮件,而是一封该怎么办呢?

Actor同样可以完成这个。我们可以将老师进行分层。后面我们讲到Supervisor和Future的时候会再回来讲下这点。

应Mohan的要求,我们把类比的实体和Actor模型中的组件做一下映射。

 

 

学生和老师都是我们的Actor。收件箱就是Mailbox组件。请求和响应是不可修改的。它们都是不可变对象。最后,Actor中的MessageDispatcher组件会管理邮箱并将消息路由到对应的Mailbox中。

 

说得够多的了,我们来写下代码吧...

 

未完待续...

 

 

原创文章转载请注明出处:Java译站

英文原文链接

3
1
分享到:
评论

相关推荐

    scala rpc基础搭建

    接下来,我们来看`akka笔记.txt`中的内容,可能会涉及如何创建Actor以及如何进行远程调用: 1. 创建Actor:使用`Props`和`ActorSystem`创建Actor。例如: ```scala val system = ActorSystem("MySystem") val ...

    spark源码阅读笔记

    ### Spark源码阅读笔记 #### 一、Spark概述与特性 **Spark** 是一款由加州大学伯克利分校AMP实验室研发的数据处理框架,它极大简化了开发者编写并行应用程序的过程,使得用户能够在集群环境中轻松地运行自己的应用...

    scala讲解笔记 入门及进阶 PDF文档1-5

    Actor模型在Akka中扮演核心角色,这部分将解释Actor如何工作,以及如何创建、交互和管理Actor。这为开发大规模并发应用提供了基础。 第五部分:"Scala入门及进阶-part05-实战技巧与最佳实践.pdf" 提供了Scala编程的...

    spark源码阅读笔记(详)

    1. **通信框架**: Spark采用了**Akka** 和 **Netty** 这两种成熟的通信技术,这些技术已经被广泛应用于生产环境,具有稳定性和高效性。 2. **Shuffle实现**: Spark中的Shuffle功能主要借鉴了**MapReduce**的设计...

    快学Scala 第2版.zip

    9. ** Akka框架**:Akka是基于Actor模型的并发处理库,通常与Scala一起用于构建高可用、容错的系统。 10. ** Spark与Scala结合**:讲解如何使用Scala来编写Spark应用程序,包括DataFrame、RDD和Spark SQL等关键组件...

    Scala-学习资料-mht.rar

    5. Akka框架:Akka是用Scala编写的开源框架,用于构建高度可扩展、容错的应用程序,它充分利用了Scala的Actor模型。 6. Scala与Java互操作:由于Scala是运行在JVM上的,所以可以直接使用Java库,与Java代码无缝集成...

    scala笔记:学习scala时的笔记

    - Akka框架在Scala中提供了Actor模型,用于构建并发和分布式系统。 - Actors是轻量级的并发实体,通过消息传递进行通信,确保线程安全。 9. **类型类**: - 类型类是一种设计模式,通过隐式参数实现,使得类型...

    Scala笔记Markdown版本(至集合章节)

    Scala的Akka库提供了Actor模型,这是一种用于处理并发和分布式系统的强大工具。Actors是轻量级的线程,通过消息传递进行通信,保证了系统的一致性。 **8. Scaladoc** Scala的文档生成工具Scaladoc与Java的Javadoc...

    scala学习资料

    Akka框架是Scala生态系统中的重要组件,提供了一套基于actor模型的并发解决方案。 8. Scala与Java的互操作性:Scala可以直接调用Java的库,反之亦然。这对于既有Java基础又想尝试新语言的开发者来说,是一个极大的...

    尚硅谷_韩顺平_Scala语言核心编程_PDF密码解除1

    初学者通常从基础语法开始,包括变量声明、函数定义、类和对象的创建,然后逐步接触更高阶的概念,如模式匹配、Actor模型、集合操作等。通过编写简单的示例程序,可以快速上手Scala编程。 总的来说,Scala是一门...

    Scala-Tutorial:Scala语法学习笔记与程式码范例from 韩顺平老师教学

    13. Akka框架:利用Actor模型实现并发,每个Actor有自己的状态和邮箱,通过消息传递进行通信。 八、Scala与其他Java技术的交互 14. 兼容性:Scala可以直接调用Java代码,反之亦然,无缝对接Java生态系统。 九、元...

    MyScalaStep:一步步记录我学习scala

    Akka框架,基于Scala的Actor库,提供了一种高效、容错的并发编程模型。通过Actor,程序中的组件可以并行执行,且通过消息传递进行通信,避免了共享状态的问题,从而简化了并发编程的复杂性。 另外,Scala还与Java...

    Scala-notes:小号

    6. **Actor模型**:Scala支持Akka框架,提供了基于Actor模型的并发处理,能有效管理共享状态,实现高效并发编程。 7. **模式匹配**:Scala的模式匹配允许我们解构复杂数据结构,如case class,增强了代码的可读性和...

    Presentations:我已经或计划进行的演讲目录

    4. **Akka.NET**:一个用于构建高度并发、分布式和反应式微服务的.NET框架,可能的演讲内容包括Actor模型、事件驱动编程和分布式系统设计。 5. **Hacktoberfest**:这是一个鼓励人们参与开源项目的年度活动,肖恩...

Global site tag (gtag.js) - Google Analytics