《七周七并发模型》第五章Actor总结

简介:

5.5 复习

Smalltalk的设计者、面向对象编程之父Alan Kay曾经这样描述面向对象的本质①:很久以前,我在描述“面向对象编程”时使用了“对象”这个概念。很抱歉这个概念让许多人误入歧途,他们将学习的重心放在了“对象”这个次要的方面。
真正主要的方面是“消息”……日文中有一个词ma,表示“间隔”,与其最为相近的英文或许是“ interstitial”。创建一个规模宏大且可生长的系统的关键在于其模块之间应该如何交流,而不在于其内部的属性和行为应该如何表现。这段话也概括了使用actor模型进行编程的精髓——我们可以认为actor模型是面向对象模型在并发编程领域的扩展。 actor模型精心设计了消息传输和封装的机制,强调了面向对象的精髓,可以说actor模型非常“面向对象”。

优点

actor有许多优良的特性,适用于解决多种并发问题。消息传输和封装虽然多个actor可以同时运行,但它们并不共享状态,而且在单个actor中所有事件都是串行执行的。所以关于并发,只需要关注于多个actor之间的消息流即可。

对开发人员来说这是个重大利好。每个actor可以被单独测试,而且当测试覆盖了某个actor的消息类型和消息顺序时,就可以确定这个actor非常可靠。如果发现了一个与并发相关的bug,也就知道重点应该放在actor之间的消息流上。

容错
使用actor模型的程序天生具有容错性。这不仅会让程序更加强壮,而且(通过“任其崩溃”的哲学)会让代码更加简洁明了。

分布式编程

actor模型支持共享内存模型,也支持分布式内存模型,这就带来了很多优点。首先, actor模型几乎可以解决任何规模的问题。我们不需要将问题局限于用一个系统解决。其次, actor模型可以解决地理分布式问题。对于不同部分需要部署在不同地理位置的软件,Actor模型是个极佳的选择。最后,分布式是软件具有容错能力的基石。

缺点

尽管使用actor模型的程序比使用线程与锁模型的程序更容易debug,但actor模型仍会碰到死锁这一类的共性问题,也会碰到一些actor模型独有的问题(例如信箱溢出)。

类似于线程与锁模型, actor模型对并行也没有提供直接支持。需要通过并发的技术来构造并行的方案,这样就会引入不确定性。而且,由于多个actor并不共享状态,仅通过消息传递来进行交流,所以不太适合实施细粒度的并行。

其他语言

与许多伟大的思想一样, actor模型也由来悠久——20世纪70年代Carl Hewitt首次提出这个模型。 Erlang无疑为布道actor做了最大的贡献。比如Erlang的创始人Joe Armstrong也是“任其崩溃”哲学的先驱。大部分流行的编程语言都提供了一个actor库,特别是Akka库①为Java和其他运行于JVM的语言提供了对actor模型的支持。如果想深入学习Akka,建议阅读本书的奖励章节②,其中描述了如何用Scala进行actor编程。
——————————
① http://akka.io
② http://media.pragprog.com/titles/pb7con/Bonus_Chapter.pdf (此文有兴趣翻译的可以联系并发编程网

结语

actor模型是应用最广泛的编程模型之一——不仅提供了并发支持,还支持分布式、错误检测和容错。当面对越来越大的分布式需求时,该模型是解决问题的绝佳选择。

下一章我们将学习通信顺序进程( Communicating Sequential Processes, CSP)。虽然CSP模型看上去类似于actor模型,但区别在于: actor模型的重点在于参与交流的实体,而CSP模型的重点在于用于交流的通道。因此使用CSP模型将是另一番体验。

相关文章
|
5月前
|
机器学习/深度学习 存储 人工智能
大白话讲清楚:什么是 Langchain 及其核心概念
大白话讲清楚:什么是 Langchain 及其核心概念
313 1
Actor并发编程模型浅析
Actor 模型其实就是定义一组规则,这些规则规定了一组系统中各个模块如何交互及回应。在一个 Actor 系统中,Actor 是最小的单元模块,系统由多个 Actor 组成。每个 Actor 有两个东西,一个是 mailbox,一个是自身状态。
1953 0
|
11月前
|
安全 Java 数据处理
Python多线程编程:概念、技巧及最佳实践
Python多线程编程:概念、技巧及最佳实践
|
消息中间件 存储 缓存
快学Actor编程
快学Actor编程
199 0
|
运维 Java
《Akka应用模式:分布式应用程序设计实践指南》读书笔记7
容错   容错绝对是分布式系统最难搞定的事儿,至少我这样认为,因为意外总是会发生。   处理故障在许多方面意味着要放弃全局一致性。Akka是基于不粗要调用方负责处理故障的想法而建立的。它主张由发生故障的actor负责处理问题,在actor不能处理的情况下,会向其“监督者”寻求帮助。
1747 0
|
前端开发 调度 安全
《Akka应用模式:分布式应用程序设计实践指南》读书笔记4
优秀的Actor设计   我看到这一章节真是如获至宝,毕竟它阐释了如何使用Akka,以及优秀的设计模式。 大系统小做   其实作者想告诉我们的是要尽量提前关注actor级别的设计,而不是仅仅考虑大的架构。
1700 0
|
设计模式 消息中间件 程序员
《Akka应用模式:分布式应用程序设计实践指南》读书笔记1
  作者属于Scala、Akka技术爱好者,但苦于Akka没有关于设计模式的文章,偶尔搜到《Akka应用模式》一书,如获至宝。现整理一些读书笔记和自己的感悟,以供参考。 Actor模型 Actor模型感觉还是很给力的,要是按我以前学习actor模型,绝对会对他嗤之以鼻,这玩儿意能干啥。
1859 0