作者:Paul Butcher 译者:黄炎 出品方:图灵 出版社:人民邮电出版社 (感谢图灵授权并发编程网发布此文)
使用actor就像租车——我们如果需要,可以快速便捷地租到一辆;如果车辆发生故障,也不需要自己修理,直接打电话给租车公司更换另外一辆即可。
actor模型是一种适用性非常好的通用并发编程模型。它可以应用于共享内存架构和分布式内存架构,适合解决地理分布型的问题。同时它还能提供很好的容错性。
5.1 更加面向对象
函数式编程不使用可变状态,也就避免了共享可变状态带来的问题。相比之下,使用actor 模型保留了可变状态,只是不进行共享。actor类似于面向对象(OO)编程中的对象——其封装了状态,并通过消息与其他actor通信。
两者的区别是一个actor与其他actor是同时运行的,并且与OO式的“消息传递”(实质上只是调用一个方法)不同,actor之间的消息传递是真实地在传递消息。
actor模型是一个通用的并发编程模型,几乎可以用在任何一种编程语言里, 典型的是 Erlang①。而我们将用Elixir②来介绍actor模型,它是运行在Erlang虚拟机(BEAM)上的相对较新的一门编程语言。
与Clojure类似,Elixir是一门不纯粹的、动态类型的函数式语言。如果你熟悉Java或者Ruby,很容易就能看懂Elixir代码。与以往一样,我们不会把本章写成Elixir的教程(本书的主旨是并发,而不是编程语言),但仍将介绍一些必要的语言特性。如果你对这门语言并不熟悉,那就不得不在某些地方“盲目”接受本书的说法——如果想深入学习Elixir,推荐阅读Programming Elixir[Tho14]。
第一天,我们将学习actor模型的基础——如何创建actor、发送消息和接收消息。第二天,学习使用actor模型的程序具有容错性的关键:失败检测和“任其崩溃”的哲学。第三天,学习如何通过actor模型编写分布式程序,将计算扩展到多台计算机,并能从一台或多台计算机的崩溃中恢复过来。