技术再深入一点又何妨?一脸懵B的聊Actor
记得上次深入 Resin 源码时,见到了Actor 字眼,当时主要从 Resin 中抽取关键架构,就屏蔽了 Actor 相关代码。未曾想这两天研究 flink 的运行架构以及源码,再次与 Actor 邂逅,唯恐你们也在趟坑,索性今天就在猿门开坛设法,我们一起学习一下 Actor 模型。
好了,请准备好小板凳,我们的分享开始。
为了让你集中精力,咱们先抛个面试题一起玩一玩,看看你能不能答上来?
问题:能否说说线程之间是如何通信的?
元芳:咋一听,心中估计一万只草泥马飞奔而过。
答:
线程的通信是指线程之间以何种机制来交换信息。在编程中,线程之间的通信机制有两种,共享内存和消息传递。(给你10分)
在共享内存的并发模型里,线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信,典型的共享内存通信方式就是通过共享对象进行通信。(给你5分)
但是一旦共享变量变得多起来,并且涉及到多种不同线程对象的交互,这种管理会变得非常复杂,极容易出现死锁等问题。(给你10分)
在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过明确的发送消息来显式进行通信,消息传递最有名的方式应该是 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的更多相关文章
- Android图表库MPAndroidChart(七)—饼状图可以再简单一点
Android图表库MPAndroidChart(七)-饼状图可以再简单一点 接上文,今天实现的是用的很多的,作用在统计上的饼状图,我们看下今天的效果 这个效果,我们实现,和之前一样的套路,我先来说下 ...
- 面试官问:HashMap在并发情况下为什么造成死循环?一脸懵
这个问题是在面试时常问的几个问题,一般在问这个问题之前会问Hashmap和HashTable的区别?面试者一般会回答:hashtable是线程安全的,hashmap是线程不安全的. 那么面试官就会紧接 ...
- hdf第一周完了,突然时间静止.,醒了就早点去公司上班,再努力一点
周一要了个任务,做评价完成,分享完成的页面,做到周四发现可能做不出来,找dzy,逻辑比较混乱,想要放弃了,感觉自己非常没用.昨天跟豆聊了一下,否定自己是一点意义也没有的,觉得自己很差劲,无助的感觉跟初 ...
- 前端通信:ajax设计方案(八)--- 设计请求池,复用请求,让前端通信快、更快、再快一点
直接进入主题,本篇文章有点长,包括从设计阶段,到摸索阶段,再到实现阶段,最后全面覆盖测试阶段(包括数据搜集清洗),还有与主流前端通信框架进行对比PK阶段. 首先介绍一下一些概念: 1. 浏览器的并发能 ...
- 让小区运营再智能一点,EasyRadius正式向WayOs用户提供到期弹出式提示充值页面
其实一直没向用户提供到期弹出式页面,主要是给VIP群的用户一点优越感,随着这次EasyRadius的更新,海哥就免费向普通easyRadius用户提供这两个模板下载. 有些人会问,什么样的模板.有什么 ...
- 饿了么CTO张雪峰:允许90后的技术人员“浮躁“一点
编者按:今年4月,饿了么正式加入了阿里新零售战队,进一步加速其在本地生活市场的扩张速度.在创业9年的时间中,饿了么在外卖领域经历了真正的“从0到1”,尤其是在外卖平台的技术升级方面,越过了一个又一个的 ...
- 这个 Redis 连接池的新监控方式针不戳~我再加一点佐料
Lettuce 是一个 Redis 连接池,和 Jedis 不一样的是,Lettuce 是主要基于 Netty 以及 ProjectReactor 实现的异步连接池.由于基于 ProjectReact ...
- 再深入一点ajax
1.建立兼容性强的XHR对象有那么复杂么? 看过一些书,书上为了写针对低版本IE和其他非IE浏览器需要写一大串兼容函数,典型的就是JS高级程序上的. 可是在现实开发中,为了兼容IE6/IE7,只需要这 ...
- 勿在浮沙筑高台-- 关于IT技术学习的一点反思
常常看到前辈们大牛们感慨, 感慨我们这一代人生活在最好的时代, 拥有海量的学习资源以及指数增长的新技术与新知识. 的确, 如果你是这个时代的大学生,或是初出茅庐的程序员, 你会发现有太多太多的选择, ...
随机推荐
- 关于使用Binlog和canal来对MySQL的数据写入进行监控
先说下Binlog和canal是什么吧. 1.Binlog是mysql数据库的操作日志,当有发生增删改查操作时,就会在data目录下生成一个log文件,形如mysql-bin.000001,mysql ...
- python之三元表达式,列表|字典推导式,函数对象
#### 三元表达式: 就是if....else...的语法糖 # -- 1) 只能解决if...else...结构,其他if分支结构都不管 # -- 2)一个分支提供一个结果: 如果一个分支提供了多 ...
- vue如何新建一个项目
第一步:安装node 首先下载安装node 安装步骤参考:https://www.cnblogs.com/qdwz/p/10820554.html window+R打开控制命令行cmd node -v ...
- 使用vue cli3新建一个vue项目
写在最前 虽然身为一个java后端工作者,前端还是要沾点的,基于vue的火热,所以平常的工作中项目前端基本都是vue.这次就主要讲一讲vue项目的创建,并从vue的安装开始讲起,附带上我之前安装使用时 ...
- 《前端之路》 - 初试 TypeScript(一)基础数据类型
一.先讲讲 TypeScript 什么是 typeScript ? typeScript 是 Javascript 的超集 我们用一张图来简单介绍下 ts 和 js 清清楚楚明明白白的关系- 为什么会 ...
- Python之locust踩坑指北
坑点1:locust安装报错 其中一种情况:error:Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visua ...
- 【Python】pyinstaller打包运行报错failed to execute script main
前言 最近用pyinstaller打包的时候一直报"failed to execute script main". 最终使用"pyinstaller --hidden-i ...
- mysql schema设计中应避免的陷阱
谨记红字: 1. 表中谨防太多列: MySQL 的存储引擎API 工作时需要在服务器层和存储引擎层之间通过行缓冲格式拷贝数据,然后在服务器层将缓冲内容解码成各个列.从行缓冲中将编码过的列转换成行数据结 ...
- 【Weiss】【第03章】练习3.6:有序多项式相加
[练习3.6] 编写将两个多项式相加的函数.不要毁坏输入数据.用一个链表实现. 如果这两个多项式分别有M项和N项,那么你程序的时间复杂度是多少? 两个按幂次升序的多项式链表,分别维护一个指针. 幂较小 ...
- npm和yarn使用
npm和yarn使用 他们都属于js包管理工具,都可以安装包或者模块yarn 是由facebook.google等联合开发推出的 区别: npm 下载包的话 比如npm install,它是按照包的排 ...