技术再深入一点又何妨?一脸懵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技术学习的一点反思
常常看到前辈们大牛们感慨, 感慨我们这一代人生活在最好的时代, 拥有海量的学习资源以及指数增长的新技术与新知识. 的确, 如果你是这个时代的大学生,或是初出茅庐的程序员, 你会发现有太多太多的选择, ...
随机推荐
- elasticsearch 创建索引
一.基本概念 索引:含有相同属性的文档的集合. //可以想象成一个数据库 database 类型:索引可以定义一个或多个类型,文档必须属于一个类型. //可以想象成数据库中的表 table 文档:文档 ...
- 前端解决跨域问题的终极武器——Nginx反向代理
提到代理,分为:正向代理和反向代理. 正向代理:就是你访问不了Google,但是国外有个VPN可以访问Google,你访问VPN后叫它访问Google,然后把数据传给你. 正向代理隐藏了真实的客户端. ...
- GPS信号模拟器信号发生器应用介绍
GPS信号模拟器信号发生器应用介绍 随着近些年的科学技术不断发展,卫星导航技术也在日益发展和成熟,并在不同领域得到广泛的应用.尤其在导航定位接收机的研制测试阶段,就需要GPS信号模拟器来模拟不同环境和 ...
- Flink系列之1.10版流式SQL应用
随着Flink 1.10的发布,对SQL的支持也非常强大.Flink 还提供了 MySql, Hive,ES, Kafka等连接器Connector,所以使用起来非常方便. 接下来咱们针对构建流式SQ ...
- Python模块二
os模块是与操作系统交互的一个接口 <em>#和文件夹相关 os.makedirs('dirname1/dirname2') 可生成多层递归目录 os.removedirs('di ...
- (转)浅析epoll-为何多路复用I/O要使用epoll
原文地址:http://www.cppfans.org/1417.html 浅析epoll-为何多路复用I/O要使用epoll 现如今,网络通讯中用epoll(linux)和IOCP(windows) ...
- 【简介】OpenOCD 由jtag操作到parport driver流程
1. 定义 jtag_command_type 在 OpenOCD 中,JTag 命令在枚举 jtag_command_type 中定义,定义如下: /** * The type of the @c ...
- Swift 4.0 高级-自定义操作符
在Swift语言中,常见的操作符有+.-.*./.>.<.==.&&.||等等,如果不喜欢,你也可以定义自己喜欢的操作符. 操作符类型 中置运算符(infix operat ...
- CAS无锁模式
一.java内存模型:JMM 在内存模型当中定义一个主内存,所有声明的实例变量都存在于主内存当中,主内存的数据会共享给所有线程,每一个线程有一个块工作内存,工作内存当中主内存数据的副本当更新数据时,会 ...
- identityserver4源码解析_2_元数据接口
目录 identityserver4源码解析_1_项目结构 identityserver4源码解析_2_元数据接口 identityserver4源码解析_3_认证接口 identityserver4 ...