记得上次深入 Resin 源码时,见到了Actor 字眼,当时主要从 Resin 中抽取关键架构,就屏蔽了 Actor 相关代码。未曾想这两天研究 flink 的运行架构以及源码,再次与 Actor 邂逅,唯恐你们也在趟坑,索性今天就在猿门开坛设法,我们一起学习一下 Actor 模型。

好了,请准备好小板凳,我们的分享开始。

为了让你集中精力,咱们先抛个面试题一起玩一玩,看看你能不能答上来?

问题:能否说说线程之间是如何通信的?

元芳:咋一听,心中估计一万只草泥马飞奔而过。

答:

  1. 线程的通信是指线程之间以何种机制来交换信息。在编程中,线程之间的通信机制有两种,共享内存和消息传递。(给你10分)

  2. 在共享内存的并发模型里,线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信,典型的共享内存通信方式就是通过共享对象进行通信。(给你5分)

  3. 但是一旦共享变量变得多起来,并且涉及到多种不同线程对象的交互,这种管理会变得非常复杂,极容易出现死锁等问题。(给你10分)

  4. 在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过明确的发送消息来显式进行通信,消息传递最有名的方式应该是 Actor 模型了。(给你5分)

那重点就来了,剩下的 70 分哪里去啦?

各位看官莫着急,我调皮的把剩余的分数分配给了:什么是 Actor 模型呢?(给70分)

各部门注意!灯光道具准备!下面让我们有请 Actor 登场。

其实 Actor 模型并非新鲜物种,它是由 Carl Hewitt 于上世纪 70 年代早期提出,主要是为了解决分布式编程中,一系列的编程问题。

Don’t communicate by sharing memory, share memory by communicating。

不要通过共享内存来通信,而应该通过通信来共享内存。

大家应该对 OOP 面向对象编程,或多或少都了解过。其中核心思想是「Every thing is Object,一切皆是对象」。而我们经常使用类和对象进行建模。

而 Actor 模型的理念则惊人的相似「天下万物皆是 Actor」。通过不同Actor之间的消息传递实现模块之间的通信和交互。

OMG!说了这么多,这么生涩,难懂,依然还是没有没搞懂啊!那到底什么是 Actor 模型呢?

如上图所示一个简单的 Actor 模型系统,其中 Actor 是最小的单元模块,系统由多个 Actor 组成。每个 Actor 有两个东西,一个是邮箱(MailBox);一个是自身的状态(state)。同时 Actor 具有接收和发送功能,Actor 与 Actor 之间只能通过消息(Message)通讯。

状态(state):Actor 中的状态指的是 Actor 对象的变量信息,状态由 Actor 自己管理,避免了并发环境下的锁和内存原子性等问题。

邮箱(MailBox):作为一个消息队列。邮箱是 Actor 和 Actor 之间的通信桥梁,邮箱内部通过 FIFO 消息队列来存储发送方 Actor 消息,接受方 Actor 从邮箱队列中获取消息。

消息(Message):消息是不可变的, 它的发送都是异步的,其中用 MailBox 来缓存消息。

说到这,不得不举一个不太恰当,但是却很应景的栗子。高中时给姐姐写信的场景。当时上高中时我还没有用过手机、也很少上网,大家都流行写信。所以我与姐姐经常靠写信来互报平安,偶尔姐姐也会在信封中夹几十块钱的零用钱给我,现在想想每次打开信封都开心。每次我写好信,只需根据姐姐的地址把信投寄到相应的信箱中,具体邮局系统是如何帮我送达给姐姐的,其实我也不清楚,姐姐收到信后,也会根据我的地址投寄到对应的信箱中,我也会收到姐姐的回复的信件。

解说一下,信件就相当于 Actor 模型中的消息(Message),Actor 与 Actor 之间通过消息进行通信;信箱就相当于 Actor 模型中的 MailBox;事情的参与者就相当于系统中 Actor。

到这一步,大概对 Actor 模型有了初步的了解。那我们不妨回想一下大数据的入门程序 HelloWorld 之 WordCount。当我们运行 WordCount 作业时,划分为拆分、统计、合并三种子任务,其实会对应出 SplitActor、CountActor 以及 MergeActor,其中 SplitActor 接收到消息后主要完成文本的分割,把分割后的数据发送给 CountActor;然后 CountActor 进行统计单词的数目,接着发送消息给 MergeActor;最后 MergeActor 收到消息后,合并每个单词的数目,完成 WordCount 作业。

好了,罗里吧嗦,苦涩的水文一篇,重点是为了下一篇 Akka 实战做铺垫。

今天的分享,主要让你对 Actor 模型有一个初步的了解,如果以后再提 Actor 模型,知道在一猿小讲见过,那么这次的分享就算成功。

技术再深入一点又何妨?一脸懵B的聊Actor的更多相关文章

  1. Android图表库MPAndroidChart(七)—饼状图可以再简单一点

    Android图表库MPAndroidChart(七)-饼状图可以再简单一点 接上文,今天实现的是用的很多的,作用在统计上的饼状图,我们看下今天的效果 这个效果,我们实现,和之前一样的套路,我先来说下 ...

  2. 面试官问:HashMap在并发情况下为什么造成死循环?一脸懵

    这个问题是在面试时常问的几个问题,一般在问这个问题之前会问Hashmap和HashTable的区别?面试者一般会回答:hashtable是线程安全的,hashmap是线程不安全的. 那么面试官就会紧接 ...

  3. hdf第一周完了,突然时间静止.,醒了就早点去公司上班,再努力一点

    周一要了个任务,做评价完成,分享完成的页面,做到周四发现可能做不出来,找dzy,逻辑比较混乱,想要放弃了,感觉自己非常没用.昨天跟豆聊了一下,否定自己是一点意义也没有的,觉得自己很差劲,无助的感觉跟初 ...

  4. 前端通信:ajax设计方案(八)--- 设计请求池,复用请求,让前端通信快、更快、再快一点

    直接进入主题,本篇文章有点长,包括从设计阶段,到摸索阶段,再到实现阶段,最后全面覆盖测试阶段(包括数据搜集清洗),还有与主流前端通信框架进行对比PK阶段. 首先介绍一下一些概念: 1. 浏览器的并发能 ...

  5. 让小区运营再智能一点,EasyRadius正式向WayOs用户提供到期弹出式提示充值页面

    其实一直没向用户提供到期弹出式页面,主要是给VIP群的用户一点优越感,随着这次EasyRadius的更新,海哥就免费向普通easyRadius用户提供这两个模板下载. 有些人会问,什么样的模板.有什么 ...

  6. 饿了么CTO张雪峰:允许90后的技术人员“浮躁“一点

    编者按:今年4月,饿了么正式加入了阿里新零售战队,进一步加速其在本地生活市场的扩张速度.在创业9年的时间中,饿了么在外卖领域经历了真正的“从0到1”,尤其是在外卖平台的技术升级方面,越过了一个又一个的 ...

  7. 这个 Redis 连接池的新监控方式针不戳~我再加一点佐料

    Lettuce 是一个 Redis 连接池,和 Jedis 不一样的是,Lettuce 是主要基于 Netty 以及 ProjectReactor 实现的异步连接池.由于基于 ProjectReact ...

  8. 再深入一点ajax

    1.建立兼容性强的XHR对象有那么复杂么? 看过一些书,书上为了写针对低版本IE和其他非IE浏览器需要写一大串兼容函数,典型的就是JS高级程序上的. 可是在现实开发中,为了兼容IE6/IE7,只需要这 ...

  9. 勿在浮沙筑高台-- 关于IT技术学习的一点反思

    常常看到前辈们大牛们感慨, 感慨我们这一代人生活在最好的时代, 拥有海量的学习资源以及指数增长的新技术与新知识. 的确, 如果你是这个时代的大学生,或是初出茅庐的程序员, 你会发现有太多太多的选择,  ...

随机推荐

  1. Redis系列五 - 哨兵、持久化、主从

    问:骚年,都说Redis很快,那你知道这是为什么吗? 答:英俊潇洒的面试官,您好.我们可以先看一下 关系型数据库 和 Redis 本质上的区别. Redis采用的是基于内存的,采用的是单进程单线程模型 ...

  2. go-admin基于Gin + Vue + Element UI的前后端分离权限管理系统

    ✨ 特性 遵循 RESTful API 设计规范 基于 GIN WEB API 框架,提供了丰富的中间件支持(用户认证.跨域.访问日志.追踪ID等) 基于Casbin的 RBAC 访问控制模型 JWT ...

  3. vux中表单验证,在提交时自动聚焦到未验证通过的那栏;及循环表单的验证

    首先vux中的表单验证在点击触发,失焦时才显示错误信息,如果不管它,它就没反应,这显然是不合理的:解决办法就是:在提交时做验证,不通过的话就使用.focus()及.blur()方法给它聚焦,失焦. i ...

  4. 五分钟完成 ABP vNext 通讯录 App 开发

    五分钟完成 ABP vNext 通讯录 App 开发 ABP vNext(后文简称Abp)是 Volo 公司堪称艺术品级的应用开发框架,它基于领域驱动设计(DDD)的思维,创新地采用了模块化的设计.A ...

  5. go源码分析(五) 获取函数名和调用者的函数名

    参考资料 实现代码保存在我的github // input flag 1:FunName 2:CallerFunName func GetFuncName(flag int) string {     ...

  6. 当AI遇上K8S:使用Rancher安装机器学习必备工具JupyterHub

    Jupyter Notebook是用于科学数据分析的利器,JupyterHub可以在服务器环境下为多个用户托管Jupyter运行环境.本文将详细介绍如何使用Rancher安装JupyterHub来为数 ...

  7. emWin模拟器Visual Studio开发时无法printf打印的问题

    1.emWin模拟器 为了方便用户学习evWin框架,Segger设计了一个PC仿真的工具,可以测试绝大部分GUI的功能,除了方便使用者学习之外,还可以加速项目开发进度.毕竟在PC上用Visual S ...

  8. python高阶函数&异常处理

    高阶函数 1.什么是高阶函数 在Python中,变量可以指向函数 函数名也是变量 既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数. ma ...

  9. docker redis安装及配置(外网访问 关闭安全限制 设置密码)

    docker run -p 6379:6379 --name redis -v /usr/local/redis/etc/redis.conf:/etc/redis/redis.conf -v /us ...

  10. ijkplayer中遇到的问题汇总

    在做音频播放的时候,很多公司使用的是开源的ijkplayer播放器,ijkplayer底层是基于ffmpeg,在某机型上面可能常常遇到各种问题.今天整理了大家在使用ijkplayer中遇到的问题,以及 ...