技术再深入一点又何妨?一脸懵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技术学习的一点反思
常常看到前辈们大牛们感慨, 感慨我们这一代人生活在最好的时代, 拥有海量的学习资源以及指数增长的新技术与新知识. 的确, 如果你是这个时代的大学生,或是初出茅庐的程序员, 你会发现有太多太多的选择, ...
随机推荐
- vue-cli脚手架目录(2.0)
vue-cli脚手架目录一览 最近在学习vue,看的稀里糊涂.今天从头开始,把cli配置的vue项目目录和配置文件搞清楚. 先看看整个项目目录结构: 再看看build文件夹下相关文件及目录: co ...
- 用vue-cli进行npm run dev时候Cannot GET/
在用vue cli进行项目npm run dev 时候,页面Cannot GET/ 主要是把config/index.js里面的dev:{assetsPublicPath:'/'}改成了跟build里 ...
- Redux 架构理解
Redux 是一种前端“架构模式”,是 Flux 架构的一种变种,用来提供可预测的状态管理.虽然经常和 React 一起被提及,但是 Redux 却不仅仅只能用于 React,还可以将其运用到其他前端 ...
- nes 红白机模拟器 第7篇 编译使用方法
模拟器,基于 InfoNES ,作者添加修改以下功能: 1, joypad 真实手柄驱动程序(字符型设备驱动) 2,原始图像只有256*240 ,添加 图像放大算法,这里实现了2种,a, 最近邻插值 ...
- FSBPM流程引擎(002)之表单+自定义流程挂载到引擎
本章节介绍如何将实际业务的表单和自定义流程挂载到FSBPM流程引擎上. 首先进入引擎交互界面: 点击创建:->出差申请 然后根据实际的业务输入对应的数据项即可,比如[姓名,部门,开始时间,结束时 ...
- ComplexBrowser: a tool for identification and quantification of protein complexes in large-scale proteomics datasets(大规模蛋白组学数据集中鉴定和定量蛋白复合物)
文献名:ComplexBrowser: a tool for identification and quantification of protein complexes in large-scale ...
- 如何使用pyenv在windows10安装多个python版本环境
安装pyenv-win pyenv-win的详细内容可以查看源地址 1.这里我用的是第一种安装方法: pip install pyenv-win --target %USERPROFILE%/.pye ...
- android studio 导入RecyclerView
- Linux定时备份
#!/bin/bash. /etc/profile. ~/.bash_profile# Shell script to backup MySql database # To backup Nysql ...
- 原创 记录一次线上Mysql慢查询问题排查过程
背景 前段时间收到运维反馈,线上Mysql数据库凌晨时候出现慢查询的报警,并把原始sql发了过来: --去除了业务含义的sql update test_user set a=1 where id=1; ...