Actors编程模型
Actors模型(Actor model)首先是由Carl Hewitt在1973定义, 由Erlang OTP (Open Telecom Platform) 推广,其 消息传递更加符合面向对象的原始意图。 Actors属于并发组件模型 ,通过组件方式定义并发编程范式的高级阶段,避免使用者直接接触多线程并发或线程池等基础概念。
传统多数流行的语言并发是基于多线程之间的共享内存,使用同步方法防止写争夺,Actors使用消息模型,每个Actors在同一时间处理最多一个消息,可以发送消息给其他Actors,保证了单独写原则 。从而巧妙避免了多线程写争夺。
Actors模型的特点是:
- 隔离计算实体
- "Share nothing"
- 没有任何地方同步
- 异步消息传递
- 不可变的消息 消息模型类似mailbox / queue
AKKA框架是一个实现Actors模型的Scala或Java平台,灵感来自ERlang,能更轻松地开发可扩展,实现多线程安全应用。
Actors是一个轻量级的对象,通过发送消息实现交互。每个Actors在同一时间处理最多一个消息,可以发送消息给其他Actors。在同一时间可以于一个Java虚拟机存在数以百万计的参与者,构架是一个分层的父层(管理) - 子层,其中父层监控子层的行为。还可以很容易地扩展Actor运行在集群中各个节点之间 - 无需修改一行代码。每个演员都可以有内部状态(字段/变量) ,但通信只能通过消息传递,不会有共享数据结构(计数器,队列) 。Akka框架支持两种语言Java和Scala,
WhatsApp成功背后的Erlang语言
Actor模型和CSP模型的区别
高级并发:Akka Actors和JavaEE7的EJB比较
Akka教程
AKKA框架介绍
使用Akka发送1000万消息
使用Akka实现MapReduce的单词计数
Akka+ZeroMQ消息生产者和消费者
软件事务内存STM
RXJAVA的Observable和AKKA ACTOR综合使用
为什么Actor模型是高并发事务的终极解决方案?
actor并发模型&基于共享内存线程模型
Spray + Akka高性能异步IO并发
使用Scala的Akka HTTP,Akka Stream和Reactive Mongo建立REST服务
单独写原则
LMAX架构
go reactive宣言
Scala入门之函数编程
Scala入门之基本概念
vertx入门教程
使用Kafka和ZeroMQ实现分布式Quasar Actor
相关参考
Actors模型更多专题
AKKA更多专题
reactive编程
Scala专题
Disruptor专题
并发编程
性能专题
EDA事件驱动专题
过去十几年CPU一直遵循着摩尔定律发展,单核频率越来越快,但是最近这几年,摩尔定律已然失效,CPU的工艺制程和发热稳定性之间难以取舍,取而代之的策略则是增加核心数量,目前家用电脑四核已经非常常见,服务器更是达到了32核64线程。为了有效地利用多核CPU,我们在代码层面就应该考虑到并发性。十几年的痛苦开发经历告诉我们,threads并不是获取并发性的好方法,往往会带来难以查找的bug,但是不用害怕,今天我们有很多其他方法来获得易用的并发性,比如我们接下来介绍的Actor模型。
模型 Model
Actor模型是一个概念模型,用于处理并发计算。它定义了一系列系统组件应该如何动作和交互的通用规则,最著名的使用这套规则的编程语言是Erlang。这篇文章更关注模型本身而不是它在不同语言的实现。
Actors
一个Actor指的是一个最基本的计算单元。它能接收一个消息并且基于其执行计算。
这个理念很像面向对象语言,一个对象接收一条消息(方法调用),然后根据接收的消息做事(调用了哪个方法)。
Actors一大重要特征在于actors之间相互隔离,它们并不互相共享内存。这点区别于上述的对象。也就是说,一个actor能维持一个私有的状态,并且这个状态不可能被另一个actor所改变。
聚沙成塔
One ant is no ant, one actor is no actor.
光有一个actor是不够的,多个actors才能组成系统。在actor模型里每个actor都有地址,所以它们才能够相互发送消息。Actors有邮箱
只得指明的一点是,尽管许多actors同时运行,但是一个actor只能顺序地处理消息。也就是说其它actors发送了三条消息给一个actor,这个actor只能一次处理一条。所以如果你要并行处理3条消息,你需要把这条消息发给3个actors。
消息异步地传送到actor,所以当actor正在处理消息时,新来的消息应该存储到别的地方。Mailbox就是这些消息存储的地方。
Actors通过异步消息沟通,在处理消息之前消息被存放在Mailbox中Actors做什么
当一个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。容错 Fault tolerance
Erlang 引入了「随它崩溃」的哲学理念,这部分关键代码被监控着,监控者的唯一职责是知道代码崩溃后干什么(如将这个单元代码重置为正常状态),让这种理念成为可能的正是actor模型。
每段代码都运行在process中,process是erlang称呼actor的方式。这个process完全独立,意味着它的状态不会影响其他process。我们有个supervisor,实际上它只是另一个process(所有东西都是actor),当被监控的process挂了,supervisor这个process会被通知并对此进行处理。这就让我们能创建「自愈」系统了。如果一个actor到达异常状态并崩溃,无论如何,supervisor都可以做出反应并尝试把它变成一致状态,这里有很多策略,最常见的是根据初始状态重启actor。
分布式 Distribution
另一个关于actor模型的有趣方面是它并不在意消息发送到的actor是本地的或者是另外节点上的。
转念一想,如果actor只是一些代码,包含了一个mailbox和一个内部状态,actor只对消息做出响应,谁会关注它运行在哪个机器上呢?只要我们能让消息到达就行了。这允许我们基于许多计算机上构建系统,并且恢复其中任何一台。
进一步了解
这里是一个快速的概念模型回顾,其中的概念被运用到许多知名语言和库中,比如Erlang和Elixir, Akka (for the JVM) 和 Celluloid (for Ruby)。
如果你想更深入了解actor及其背后的原理,你可以进一步阅读下面书籍和文章:
- Seven Concurrency Models in Seven Weeks: When Threads Unravel
- Programming Elixir
- Elixir in Action
- Actor模型
- 为什么Actor模型是高并发事务的终极解决方案?
这个视频比较完整地讨论了Actor的概念模型。
The Actor Model (everything you wanted to know)Scala或Erlang的进程信箱都是一种Actor模型,也有Java的专门的Actor模型,这里是几种Actor模型比较明白了Actor模型原理,使用Disruptor这样无锁队列也可以自己实现Actor模型,让一个普通对象与外界的交互调用通过Disruptor消息队列实现,比如LMAX架构就是这样实现高频交易,从2009年成功运行至今,被Martin Fowler推崇。
原文地址: http://www.brianstorti.com/the-actor-model/
作者:时见疏星链接:https://www.jianshu.com/p/449850aa8e82來源:简书著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
转载于:https://www.cnblogs.com/cjm123/p/8245587.html
Actors编程模型相关推荐
- 四种并发编程模型简介
概述 并发往往和并行一起被提及,但是我们应该明确的是"并发"不等同于"并行" • 并发 :同一时间 对待 多件事情 (逻辑层面) • 并 ...
- Actor编程模型——简介
Actor编程模型--简介 2014年10月31日 ⁄ 综合 ⁄ 共 1983字 ⁄ 字号 小 中 大 ⁄ 评论关闭 一. 引言 之前系统中有这样一处代码: 在线上运行一段 ...
- 【专家坐堂】四种并发编程模型简介
本文来自网易云社区 概述 并发往往和并行一起被提及,但是我们应该明确的是"并发"不等同于"并行" • 并发 :同一时间 对待 多件事情 (逻辑层面) ...
- CUDA刷新器:CUDA编程模型
CUDA刷新器:CUDA编程模型 CUDA Refresher: The CUDA Programming Model CUDA,CUDA刷新器,并行编程 这是CUDA更新系列的第四篇文章,它的目标是 ...
- C语言网络编程:TCP编程模型
编程模型 TCP编程模型如下 TCP服务器的工作过程如下: 服务器创建一个专门的"文件描述符"来监听来自客户端的"三次握手",然后建立链接 链接建立成功后,服务 ...
- 朴素、Select、Poll和Epoll网络编程模型实现和分析——Poll、Epoll模型处理长连接性能比较
在<朴素.Select.Poll和Epoll网络编程模型实现和分析--模型比较>一文中,我们分析了各种模型在处理短连接时的能力.本文我们将讨论处理长连接时各个模型的性能.(转载请指明出于b ...
- 朴素、Select、Poll和Epoll网络编程模型实现和分析——模型比较
经过之前四篇博文的介绍,可以大致清楚各种模型的编程步骤.现在我们来回顾下各种模型(转载请指明出于breaksoftware的csdn博客) 模型编程步骤对比 <朴素.Select.Poll和Ep ...
- 朴素、Select、Poll和Epoll网络编程模型实现和分析——Epoll模型
在阅读完<朴素.Select.Poll和Epoll网络编程模型实现和分析--Select模型>和<朴素.Select.Poll和Epoll网络编程模型实现和分析--Poll模型> ...
- 朴素、Select、Poll和Epoll网络编程模型实现和分析——Poll模型
在<朴素.Select.Poll和Epoll网络编程模型实现和分析--Select模型>中,我们分析了它只能支持1024个连接同时处理的原因.但是在有些需要同时处理更多连接的情况下,102 ...
- 朴素、Select、Poll和Epoll网络编程模型实现和分析——Select模型
在<朴素.Select.Poll和Epoll网络编程模型实现和分析--朴素模型>中我们分析了朴素模型的一个缺陷--一次只能处理一个连接.本文介绍的Select模型则可以解决这个问题.(转载 ...
最新文章
- fatal error all goroutines are asleep - deadlock!
- 成功解决SQL Server软件中出现的18456问题
- 力扣(LeetCode)258. 各位相加
- How is BDOC hold parent removal action in ERP
- 内蒙古大学计算机组成原理实验,内蒙古大学计算机组成原理期末练习0
- python中什么叫合法的标识_python合法标识符要求是什么
- Java | 使用对数器判断自己的程序是否正确(generateRandomArray)
- 浅谈SnackBar(Toast大兄弟)
- 已知坐标求方位角_震惊,up主居然能默写球坐标拉普拉斯算子!
- 深入理解C/C++ [Deep C (and C++)] (1)
- windows下sakai配置过程
- windows中判断注册表键值是否存在的一段函数
- 抓取日志的小工具(命令)Adb logcat
- 玩游戏计算机缺失msvcp140,游戏缺少msvcp140.dll错误提示怎么办解决方法
- visio2019和Mathtype7.0版本冲突,出现VBE6EXT.OLB不能被加载
- 泰拉瑞亚服务器config修改,泰拉瑞亚配置修改方法详解 泰拉瑞亚怎么修改游戏配置 Config文件-游侠网...
- python 爬取懂车帝详情页“全部车型模块信息”
- 9月17日服务器维护,《海岛纪元》9月17日维护公告 「失落之城」正式开服
- 一年中的第几天 哔哩哔哩2020校园招聘笔试题讲解
- ubuntu磁盘io性能测试工具hdparm
热门文章
- php页面强制横屏,Css实现手机端页面强制横屏(仅适用与一屏页面)
- 微乐服务器升级维护需要多久,微信系统升级要多久?微信系统维护一般要多久?...
- vue 高德地图搜索功能_vue高德地图搜索功能
- 哪类人适合学软件测试?零基础能学测试吗?
- 全系列三极管应用参数
- 常用的计算机网络设备有,常用网络设备有哪些,初学者必须要知道的五大网络设备...
- Favoring Curry
- OpenStack Days China Day 2:厨子与食客的热恋
- iphone11返回上一级手势怎么设置_iPhone 11 系列手势操作大全你了解吗?
- 微软卷土重来 只收购雅虎搜索业务