购买本书 作者:Paul Butcher 译者:黄炎 出品方:图灵 出版社:人民邮电出版社 (感谢图灵授权并发编程网发布此文)
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模型将是另一番体验。