上一篇文章简单说了一下关于 OOP 在多核环境下的一些开发问题,文章最后引出了 Actor Model 是解决这些问题的一个方法。你们能够经过如下连接查看系列文章:html
1.Elixir Para1: OOP 的局限 git
这篇文章就重点讲解一下,什么是 Actor Model,以及为何 Actor Model 会在目前的多核服务器环境中从新被重视。github
Actor Model 在 wiki 上的定义是这样的:算法
The actor model in computer science is a mathematical model of concurrent computation that treats actor as the universal primitive of concurrent computation编程
Actor Model 在计算机科学里是一种并行的计算模型,actor 表示一个计算单元。缓存
这样说,可能有点难理解。但事实上,Actor Model 是更加接近咱们所熟悉的世界的。不妨以下想象:安全
在上述的几个规则下,咱们就能够构建一整个业务的解决方案了。咱们设想一个需求:设游戏场景中存在 100 个怪物,他们可以自主进行攻击,也能够被攻击。服务器
采用 OOP 的设计方法,可能会有以下步骤:markdown
这样的步骤虽然可以实现功能,但相比之下仍是比较别扭,不够天然。Actor Model 在这种场景下就会显得很是有优点,由于 Actor Model 自己就是自驱动,拥有本身的状态,可以经过消息与外界通讯。因此咱们只须要定义 Actor 的 state 和两个 behavior,剩余就交给怪物本身去运行了。网络
线程池驱动:
Actor Model:
上述的例子是一个游戏例子,这个确实比较适合 Actor Model。如今咱们思考一个交易系统,关于里面的用户互相转帐的业务。
采用以往的设计方法,通常会有如下步骤:
这样其实也不错,但咱们能够尝试适用 Actor Model 来设计这个转帐系统,在设计这个系统前。咱们须要想象一个属于本身帐号“管家”,他知悉个人金额,并每次只会处理一次交易;
适用 Actor Model,咱们的设计以下:
在这里例子上,这并非说 Actor Model 就更加适合转帐系统,只是向引导你们思考,咱们平时设计的需求,其实换一个想法去作也是能够的,若是这个想法更贴合咱们现实世界,咱们会很是容易理解。(我在学习 lock 这个概念的时候就花了很多时间)
简单小结一下 Actor Model。Actor Model 是一种并发模型,它的思想在于:一切皆演员。在舞台上,每一个演员是自我驱动的,根据外界的消息,共同协做完成一次次业务上的表演。
一个 Actor 包含如下几个要素:
而用于通讯的,咱们统一适用 message 消息这个抽象。
简单解释一下:
Actor 模型是会容易出现死锁的。假如 A 发送消息给 B,B 发送消息给 A,同时彼此在等待回信。就会产生死锁了。
mailbox 是用于通讯的不得不存在的概念,在消息量巨大的时候,mailbox 可能会成为瓶颈。
我认为,缺乏共享内存,必定程度仍是影响性能的。例如一些读多写少的业务上,共享内存是会让性能更加好的。
最近些年,单核 CPU 的性能物理上限基本上已经达到了,接下来 CPU 的计算能力要进一步提高,只能往多核维度上去发展。如今不少云供应商都提供了多核、大内存的服务器。
咱们知道,多核 CPU 在存储金字塔上,也是存在必定问题的。由于 CPU 有本身的 L一、L二、L3 缓存,在共享内存的环境下,多核 CPU 须要经过一致性算法保证缓存的可见性,这必定程度上是影响性能的,并且这个问题还会由于核数越多,影响越大。
但 Actor Model 自然就会适应这种多核服务器。举 Erlang 的虚拟机为例子,Erlang 的虚拟机就是根据系统的核数定义调度器数量,并且调度器还能自行根据内存局部性,来提升运行的性能。
但愿你们在读完文章后,还能对 Actor Model 产生一些兴趣。有了这些基础,下一篇文章就能够开始尝试正式介绍 Elixir 语言了。喜欢的同窗能够点个赞,有疑问能够留言一块儿讨论一下,说得不对的地方,也但愿诸位大方斧正。