• 10 分钟了解 Actor 模型


    http://www.moye.me/2016/08/14/akka-in-action_actor-model/

    过去十几年CPU一直遵循着摩尔定律发展,单核频率越来越快,但是最近这几年,摩尔定律已然失效,CPU的工艺制程和发热稳定性之间难以取舍,取而代之的策略则是增加核心数量,目前家用电脑四核已经非常常见,服务器更是达到了32核64线程。为了有效地利用多核CPU,我们在代码层面就应该考虑到并发性。十几年的痛苦开发经历告诉我们,threads并不是获取并发性的好方法,往往会带来难以查找的bug,但是不用害怕,今天我们有很多其他方法来获得易用的并发性,比如我们接下来介绍的Actor模型。

    模型 Model

    Actor模型是一个概念模型,用于处理并发计算。它定义了一系列系统组件应该如何动作和交互的通用规则,最著名的使用这套规则的编程语言是Erlang。这篇文章更关注模型本身而不是它在不同语言的实现。

    Actors

    一个Actor指的是一个最基本的计算单元。它能接收一个消息并且基于其执行计算。

    这个理念很像面向对象语言,一个对象接收一条消息(方法调用),然后根据接收的消息做事(调用了哪个方法)。

    Actors一大重要特征在于actors之间相互隔离,它们并不互相共享内存。这点区别于上述的对象。也就是说,一个actor能维持一个私有的状态,并且这个状态不可能被另一个actor所改变。

    聚沙成塔

    One ant is no ant, one actor is no actor.
    光有一个actor是不够的,多个actors才能组成系统。在actor模型里每个actor都有地址,所以它们才能够相互发送消息。

    Actors有邮箱

    只得指明的一点是,尽管许多actors同时运行,但是一个actor只能顺序地处理消息。也就是说其它actors发送了三条消息给一个actor,这个actor只能一次处理一条。所以如果你要并行处理3条消息,你需要把这条消息发给3个actors。

    消息异步地传送到actor,所以当actor正在处理消息时,新来的消息应该存储到别的地方。Mailbox就是这些消息存储的地方。

     
    Actors通过异步消息沟通,在处理消息之前消息被存放在Mailbox中

    Actors做什么

    当一个actor接收到消息后,它能做如下三件事中的一件:

    • Create more actors; 创建其他actors
    • Send messages to other actors; 向其他actors发送消息
    • Designates what to do with the next message. 指定下一条消息到来的行为

    前两件事比较直观,第三件却很有意思。

    我之前说过一个actor能维持一个私有状态。「指定下一条消息来到做什么」意味着可以定义下条消息来到时的状态。更清楚地说,就是actors如何修改状态。

    设想有一个actor像计算器,它的初始状态是数字0。当这个actor接收到add(1)消息时,它并不改变它原本的状态,而是指定当它接收到下一个消息时,状态会变为1。

    容错 Fault tolerance

    Erlang 引入了「随它崩溃」的哲学理念,这部分关键代码被监控着,监控者的唯一职责是知道代码崩溃后干什么(如将这个单元代码重置为正常状态),让这种理念成为可能的正是actor模型。

    每段代码都运行在process中,process是erlang称呼actor的方式。这个process完全独立,意味着它的状态不会影响其他process。我们有个supervisor,实际上它只是另一个process(所有东西都是actor),当被监控的process挂了,supervisor这个process会被通知并对此进行处理。这就让我们能创建「自愈」系统了。如果一个actor到达异常状态并崩溃,无论如何,supervisor都可以做出反应并尝试把它变成一致状态,这里有很多策略,最常见的是根据初始状态重启actor。

    分布式 Distribution

    另一个关于actor模型的有趣方面是它并不在意消息发送到的actor是本地的或者是另外节点上的。

    转念一想,如果actor只是一些代码,包含了一个mailbox和一个内部状态,actor只对消息做出响应,谁会关注它运行在哪个机器上呢?只要我们能让消息到达就行了。这允许我们基于许多计算机上构建系统,并且恢复其中任何一台。

    进一步了解

    这里是一个快速的概念模型回顾,其中的概念被运用到许多知名语言和库中,比如Erlang和Elixir, Akka (for the JVM) 和 Celluloid (for Ruby)。

    如果你想更深入了解actor及其背后的原理,你可以进一步阅读下面书籍和文章:

    这个视频比较完整地讨论了Actor的概念模型。
    The Actor Model (everything you wanted to know)

    Scala或Erlang的进程信箱都是一种Actor模型,也有Java的专门的Actor模型,这里是几种Actor模型比较明白了Actor模型原理,使用Disruptor这样无锁队列也可以自己实现Actor模型,让一个普通对象与外界的交互调用通过Disruptor消息队列实现,比如LMAX架构就是这样实现高频交易,从2009年成功运行至今,被Martin Fowler推崇。

    原文地址: http://www.brianstorti.com/the-actor-model/



    作者:时见疏星
    链接:https://www.jianshu.com/p/449850aa8e82
    来源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
  • 相关阅读:
    (二)使用log4net写入数据库自定义日志
    (一)使用log4net生成日志文件
    微信公众号测试号内网配置以及微信网页授权
    ios浏览器调试踩坑(1)----mescroll.js和vue-scroller
    three 3D实例学习
    golang解析git log时间
    Shell 简易教程
    golang 并发程序写入map两种实现方式sync.Mutex和chan的效率对比
    golang字符串string与字符数组[]byte高效转换
    mysql begin rollback commit 事务互斥验证
  • 原文地址:https://www.cnblogs.com/dhcn/p/10916340.html
Copyright © 2020-2023  润新知