Actor模型

15 篇文章 0 订阅
订阅专栏

1、背景

处理并发问题就是如何保证共享数据的一致性和正确性,一般来说有两种策略用来在并发线程中进行通信:共享数据和消息传递。

熟悉c和java并发编程的都会比较熟悉共享数据的策略,比如java程序员就会常用到java.util.concurrent包中同步、锁相关的数据结构。使用共享数据方式的并发编程面临的最大的一个问题就是数据条件竞争(data race)。共同思路就是将数据喂给线程,数据是被动的,自身不复杂,没有自身业务逻辑要求。适合大数据处理或互联网网站应用等等。但是如果数据自身要求有严格的一致性,也就是事务机制,数据就不能被动被加工,要让数据自己有行为能力保护实现自己的一致性。处理各种锁的问题是让人十分头痛的一件事。

要让数据自己有行为维护自己的一致性,才能真正安全实现真正的事务。所以,数据+行为=对象。

但是这还不够,因为即使数据能够自己有行为,发起行为的可能还是线程,本质上还是无法避免多线程环境下的数据共享问题。所以出现了消息机制,每个数据只接受消息,真正何时何种方式执行行为,完全由数据决定。和共享数据方式相比,消息传递机制最大的优点就是不会产生数据竞争状态(data race)。

实现消息传递有两种常见的类型:基于channel的消息传递和基于Actor的消息传递。本文主要是来分享Actor模型。

2、Actor模型

Actor是计算机科学领域中的一个并行计算模型,它把actors当做通用的并行计算原语:一个actor对接收到的消息做出响应,进行本地决策,可以创建更多的actor,或者发送更多的消息;同时准备接收下一条消息。

在Actor理论中,一切都被认为是actor,这和面向对象语言里一切都被看成对象很类似。但包括面向对象语言在内的软件通常是顺序执行的,而Actor模型本质上则是并发的。

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

Actor模型=数据+行为+消息

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

Actor与Actor之间只能通过消息通信。Actor模型内部的状态由自己的行为维护,外部线程不能直接调用对象的行为,必须通过消息才能激发行为,这样就保证Actor内部数据只有被自己修改。这就解释了为什么Actor模型是一种处理并发问题的解决方案。



从上图中我们可以看到,Actor与Actor之前只能用消息进行通信,当某一个Actor给另外一个Actor发消息,消息是有顺序的,你只需要将消息投寄的相应的邮箱,至于对方Actor怎么处理你的消息你并不知道,当然你也可等待它的回复。

Actor有以下几个特点:

(1)每个Actor都有对应一个邮箱。

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

(2)每个Actor是串行处理邮箱中的消息的。

也就是说其它actors发送了三条消息给一个actor,这个actor只能一次处理一条。所以如果你要并行处理3条消息,你需要把这条消息发给3个actors。

(3)Actor中的消息是不可变的


当一个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。


3、优势

对并发模型进行了更高的抽象
异步、非阻塞、高性能的事件驱动编程模型
轻量级事件处理(1GB内存可容纳百万级别个Actor)

(1)简化并发编程:
并发导致最大的问题就是对共享数据的操作,我们在面对并发问题时多采用的是
用锁去保证共享数据的一致性,但这同样也会带来其他相关问题,比如要去考虑锁的粒度(对方法,程序块等),锁的形式(读锁,写锁等)等问题,这些问题对无疑给程序员在编程上提高了复杂性。但使用Actor就不导致这些问题,首先Actor的消息特性就觉得了在与Actor通信上不会有共享数据的困扰,另外在Actor内部是串行处理消息的,同样不会对Actor内的数据造成污染,用Actor编写并发程序无疑大大降低了编码的复杂度。

(2)提升程序性能:
我们之前说过既然用单线程处理,那如何保证程序的性能?首先Actor是非常轻量级的,你可以再程序中创建许多个Actor,而且Actor是异步的,那么如何利用它的这个特性呢,我们要做的就是把相应的并发事件尽可能的分割成一个个小的事件,让每个Actor去处理相应的小事件,充分去利用它异步的特点,来提升程序的性能。

4、实现

四种Actor框架比较
https://doc.akka.io/docs/misc/Comparison_between_4_actor_frameworks.pdf
一文比较了Scalaz Actors Lift Actors Scala Actors 和Akka Actors四种Actor框架。

复杂性最小的是Scalaz Actors和 Lift Actors。
可靠性方面Restart-on-failure,Lift Actors 和Scala Actors要好些。

都是基于JVM,没有Java的,他们称plaino jaino Java 需要矫正的Java(我认为Disruptor基本具备底层机制,需要上面再包装一下,Jdonfframework做了尝试,可以互相发消息,Restart-on-failure等没有)

5、应用

使用DDD领域驱动设计或CQRS架构就能明显发现这些情况,CQRS是读写分离,其中写操作是应领域专家要求编写的功能,在这类方向,我们都有必要使用Actor模型实现,因为在这个方向上,领域专家的要求都表达为聚合根实体,聚合根就是用Actor模型实现最合适不过了。而读方向,比如大数据处理,报表查询,OLTP等等都是数据喂机器的方式。

漫谈并发编程:Actor模型
木东居士
06-18 1万+
0x00 前言一般来说有两种策略用来在并发线程中进行通信:共享数据和消息传递。熟悉c和java并发编程的都会比较熟悉共享数据的策略,比如java程序员就会常用到java.util.concurrent包中同步、锁相关的数据结构。使用共享数据方式的并发编程面临的最大的一个问题就是数据条件竞争(data race)。处理各种锁的问题是让人十分头痛的一件事。 和共享数据方式相比,消息传递机制最大的优点
actor模型
leezsj的博客
08-09 810
actor模式是一种并发模型 线程通过消息传递进行合作,线程叫actor mapreduce是一种典型的actor 单线程编程:程序是一个工厂,只有一个工人,干所有的事儿, 多线程编程-共享内存 干啥都要排队 多线程/分布式编程:流水线,分工明确,每个线程都是一个actor,传递消息的方式进行 什么是actor: 可以看做是一个个独立的实体,单体之间毫无关联,可以通过消息,让其他的实体做出对应的事件 基于并发机制,scala运用消息的发送接收实现高并发 actor不共享数据,避免死锁,资
Actor模型介绍与应用
最新发布
weixin_44716895的博客
08-29 1174
actor模型介绍,akka介绍,自定义actor模型
Actor模式初步入门
weixin_30371875的博客
09-01 387
从实习到现在,一直在做Unity相关的业务,不知不觉中感觉已经不在关注服务器相关的技术了。一次偶然的机会再腾讯的gad平台上观看了云风在15年在腾讯做的skynet讲座(http://gad.qq.com/content/coursedetail/467),skynet是用c写的核心,lua做上层业务,基于actor模型的服务器框架,哈哈,这次学习actor模式的学习也是因此而起。 A...
Actors编程模型
01-08 555
  Actors模型(Actor model)首先是由Carl Hewitt在1973定义, 由Erlang OTP (Open Telecom Platform) 推广,其 消息传递更加符合面向对象的原始意图。 Actors属于并发组件模型 ,通过组件方式定义并发编程范式的高级阶段,避免使用者直接接触多线程并发或线程池等基础概念。    传统多数流行的语言并发是基于多线程之间的共享内...
actor-framework:C ++中Actor模型的开源实现
02-27
CAF是C ++ actor模型的开源实现,具有轻量级和快速的actor实现,消息的模式匹配,网络透明消息传递等。 在线资源 主页: : 开发者博客: : 手册: : Doxygen : : 报告错误/获得帮助 GitHub上的未解决问题: : ...
actor:Actor模型的C ++实现
05-20
它非常喜欢“标记事件驱动的体系结构”(SEDA)事件驱动器模型来进行流水线事件处理。 该系统非常适合构建IO密集型,对延迟敏感的应用程序(例如数据库,文件系统等),这些应用程序利用SSD等高吞吐量设备并支持10+...
actor模型java实现源码
04-27
在IT行业中,Actor模型是一种并发计算的模型,它源自于函数式编程领域,由英国计算机科学家C.A.R. Hoare提出。Actor模型的核心思想是将并发处理中的实体——也就是执行单元——抽象为“Actor”,每个Actor都有自己的...
SimpleActors:简单的 Actor 模型实现。 它将任何 Javascript 对象包装为演员
07-13
简单的 Actor 模型实现。 请参阅。 描述 这个实现的灵感来自 。 该模型鼓励编写由使用消息传递进行协作的参与者组成的应用程序。 在这个模块中,方法调用就像一个消息传递操作,不返回值。 使用actor 模型的应用...
ActorLite:一个轻量级Actor模型实现(中)
weixin_34391854的博客
05-14 133
从上一篇文章的反响来看,似乎大家对于这一话题并没有太大兴趣。而这篇文章将会为大家带来一个简单但完整的Actor模型实现。此外,在下一篇文章中……可能会出现一些让您觉得有趣的东西。:) 任务分配逻辑 如上文所述,这次要实现的是一个非常简单的Actor模型,使用基于事件的分配方式,直接把任务交给.NET自带的线程池去使用。不过我们又该什么时候把一个Actor推入线程池的执行队列呢?这其实取决于我们执行...
参与者模式(Actor model)
大鹏的专栏
09-26 4179
 在计算机科学中,参与者模式(英语:Actor model)是一种并行运算上的模型。“参与者”是一种程式上的抽象概念,被视为并行运算的基本单元:当一个参与者接收到一则讯息,它可以做出一些决策、建立更多的参与者、传送更多的讯息、决定要如何回答接下来的讯息。参与者模式在1973年于Carl Hewitt、Peter Bishop及Richard Steiger的论文中提出[1]。
10 分钟了解 Actor 模型
最后一份黄焖鸡的博客
12-03 745
过去十几年CPU一直遵循着摩尔定律发展,单核频率越来越快,但是最近这几年,摩尔定律已然失效,CPU的工艺制程和发热稳定性之间难以取舍,取而代之的策略则是增加核心数量,目前家用电脑四核已经非常常见,服务器更是达到了32核64线程。为了有效地利用多核CPU,我们在代码层面就应该考虑到并发性。十几年的痛苦开发经历告诉我们,threads并不是获取并发性的好方法,往往会带来难以查找的bug,但是不用害怕,...
java actor模型和消息传递实现分析
我的技术旅程
07-31 491
Actor模型是一种基于协程的消息传递模型,在并行计算和并发的消息传递中有很好的性能表现。一般的actor模块框架提供了超轻量级的线程和工具,可以在这些线程之间进行快速、安全、零复制的消息传递。在elang,ruby,lua等语言中都是直接在VM级别支持协程,VM帮你做context的保存和恢复。而在java中,却没有内置actor模型实现,但是有几个开源框架也模拟了actor模型的实现。   ...
写文章

热门文章

  • Spring@Autowired注解与自动装配 538809
  • 消息队列的两种模式 74364
  • C++中int和char[]之间的转换 54461
  • Ubuntu下编译的第一个内核模块 50569
  • ZooKeeper 节点类型 48275

分类专栏

  • Redis
  • ES
  • 系统设计
  • C/C++ 37篇
  • Hadoop 34篇
  • Java 66篇
  • Java并发编程 15篇
  • Linux 49篇
  • NoSQL 3篇
  • Web 31篇
  • Mahout 2篇
  • 其他 2篇
  • sql 3篇
  • MQ 2篇
  • Spring 1篇
  • 日志 2篇
  • 微服务 6篇

最新评论

  • Spring@Autowired注解与自动装配

    yaoyaochenxian: 过来考古了

  • c++中的前向声明

    小炫剑指大厂: 懂了

  • mapreduce编程(二)- 大象书中求每一年的最高温度

    后端码匠: Good

最新文章

  • guava LoadingCache学习
  • Cloud Native和微服务
  • Serverless和FaaS
2019年1篇
2018年10篇
2017年11篇
2016年12篇
2015年15篇
2014年37篇
2013年6篇
2011年77篇
2010年76篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家奥体商场店庆美陈苏州玻璃钢动物雕塑设计商场美陈考核表湖北玻璃钢仿真植物雕塑广场玻璃钢卡通雕塑小品花朵玻璃钢景观雕塑厂家阜阳定制玻璃钢雕塑生产厂家海南省玻璃钢人物雕塑福建走廊商场美陈怎么样山西人物玻璃钢雕塑销售厂家云浮玻璃钢商场美陈湛江玻璃钢雕塑供应厂家镂空不锈钢玻璃钢彩绘雕塑报价玻璃钢卡通雕塑橘子加工云南人物玻璃钢雕塑多少钱江苏大型主题商场美陈厂家直销南京玻璃钢花盆朔州玻璃钢雕塑多少钱宜春玻璃钢雕塑人物玻璃钢花盆价格如何沈阳玻璃钢雕塑厂厂家济宁玻璃钢海豚雕塑莱芜玻璃钢雕塑制作厂家景观玻璃钢人物雕塑代理商吉林景区玻璃钢雕塑安装深圳装饰商场美陈销售公司灵宝玻璃钢超人雕塑熊出没玻璃钢雕塑图玻璃钢雕塑与铜雕价格商场门口拱门美陈香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化