Actor模型的本质已经被强调了无数遍:万物皆Actor。Actor之间只有发送消息这一种通信方式,例如,无论是管理员让工作者干活,还是工作者把成果交还给管理员,它们之间也要通过发送消息的方式来传递信息。这么做看似不如直接方法调用来的直接,但是由于大量的消息可以同时执行。同样,消息让Actor之间解耦,消息发出之后执行成功还是失败,需要耗费多少时间,只要没有消息传递回来,这一切都和发送方无关。Actor模型的消息传递形式简化了并行程序的开发,使开发人员无需在共享内存(确切地说,其实是共享“写”)环境中与“锁”、“互斥体”等常用基础元素打交道。不过,使用Actor模型编写应用程序,需要开发人员使用一种与以往不同的设计思路,这样的思路说难倒不难,说简单也不简单。等我们有了成熟、稳固的Actor模型之后(例如高效的调度,合适的容错机制,老赵正在为此努力),再回头来探究这种特殊的架构方式。

由于Actor执行的唯一“事件”便是接受到了一个消息,而一个Actor很可能会做多件事情,因此我们一定需要一种机制,可以把消息“分派”到不同的“逻辑段”中去,并为不同的逻辑指定各自所需要的参数。例如,Person是一个Actor类型,它有三种任务,不同的任务会带有不同参数:
◆聊天(Chat):指定另一个Person对象(聊天的另一方),以及一个Topic对象(聊天的话题)。 
◆吃饭(Eat):指定一个Restaurant对象(餐馆)。 
◆干活(Work):指定一个Person对象(工作完成后的汇报人),以及一个Job对象(任务)。

当Person对象获得一条消息时,它需要将其识别为聊天、吃饭或干活中的一种,再从中获取到这个行动所需要的数据。如果用一幅示意图来表示,它可能是这样的:


如何在C#中把一条消息转化为一段逻辑的执行,并且尽可能确保一些优势(如易于编写,静态检查,代码提示,重构,单元测试……),这便是这系列文章唯一的目的。正如文章的标题,我们关注的是“消息执行方式”,而不是:
◆“消息传递”与“共享内存”两种并行方式的比较 
◆讲述Actor模型的应用程序设计方式。 
◆提出消息传递时的解耦方式。 
……

文章使用Actor模型作为示例,是因为我编写的ActorLite组件易于说明问题,并且是典型的“消息传递”场景。事实上,文章所表达的内容,适合任何基于消息传递的C#场景,例如内存中的消息队列、生产者/消费者模式、消息总线……它并没有限制Actor模型这一种架构方式。

Actor模型的本质相关推荐

  1. Actor模型的本质:究竟是要解决什么问题

    Actor模型的本质已经被强调了无数遍:万物皆Actor.Actor之间只有发送消息这一种通信方式,例如,无论是管理员让工作者干活,还是工作者把成果交还给管理员,它们之间也要通过发送消息的方式来传递信 ...

  2. 在.NET中实现Actor模型的不同方式

    上周,<实现领域驱动设计>(Implementing Domain-Driven Design)一书的作者Vaughn Vernon,发布了Dotsero,这是一个使用C#编写的.基于.N ...

  3. Java并发编程实战~Actor 模型

    Hello Actor 模型 Actor 模型本质上是一种计算模型,基本的计算单元称为 Actor,换言之,在 Actor 模型中,所有的计算都是在 Actor 中执行的.在面向对象编程里面,一切都是 ...

  4. 程序员修神之路--分布式高并发下Actor模型如此优秀

    写在开始 一般来说有两种策略用来在并发线程中进行通信:共享数据和消息传递.使用共享数据方式的并发编程面临的最大的一个问题就是数据条件竞争.处理各种锁的问题是让人十分头痛的一件事. 传统多数流行的语言并 ...

  5. 【Akka】Actor模型探索

    Akka是什么 Akka就是为了改变编写高容错性和强可扩展性的并发程序而生的.通过使用Actor模型我们提升了抽象级别,为构建正确的可扩展并发应用提供了一个更好的平台.在容错性方面我们采取了" ...

  6. 漫谈并发编程:Actor模型

    0x00 前言 一般来说有两种策略用来在并发线程中进行通信:共享数据和消息传递.熟悉c和java并发编程的都会比较熟悉共享数据的策略,比如java程序员就会常用到java.util.concurren ...

  7. skynet源码分析:服务,Actor模型,lua接口编程,demo演示Actor编程思维

    skynet刚开始是单进程多线程的,它是由一个一个的服务组成的.在skynet上做开发,实际上就是在写服务.服务与服务之间通过消息队列进行通信. 做为核心功能,Skynet 仅解决一个问题: 把一个符 ...

  8. mysql逻辑架构连接池_GitHub - zzjzzb/ycsocket: 基于swoole的socket框架,支持协程版MySQL、Redis连接池、Actor模型...

    ycsocket 基于 swoole 和 swoole_orm 的 websocket 框架,各位可以自己扩展到 TCP/UDP,HTTP. 在ycsocket 中,采用的是全协程化,全池化的数据库. ...

  9. actor 模型 锁 java_漫谈并发编程:Actor模型

    0x00 前言 一般来说有两种策略用来在并发线程中进行通信:共享数据和消息传递.熟悉c和java并发编程的都会比较熟悉共享数据的策略,比如java程序员就会常用到 java.util.concurre ...

最新文章

  1. mysql plsql循环语句吗,Oracle PLSQL 在游标中用while循环实例程序
  2. 8个流行的Python可视化工具包!!!
  3. JS,Jquery获取各种屏幕的宽度和高度
  4. 切面是异步还是同步操作‘_【 .NET Core 3.0 】框架之十 || AOP 切面思想
  5. 启动postgres
  6. Shell——文件包含
  7. 实现labelme批量json_to_dataset方法
  8. 数字化方法基础(三)_导入本地模型
  9. html网页制作中的问题,网页制作中注意应用HTML标签的问题
  10. Python 类与对象
  11. Golang - Structs 包的使用
  12. 卡尔曼滤波原理及公式推导
  13. 一文读懂TCP/IP组包发包全过程
  14. 第四单元 用python学习微积分(二十八)参数方程、弧长和表面积
  15. 电子邮件链接格式html主题,html创建电子邮件链接的方法
  16. Flutter 错误解决Building with plugins requires symlink support.
  17. Apache NIFI入门(读完即入门)
  18. Python中的单行、多行、中文注释
  19. DT、RF、GBDT、XGBoost
  20. 【C语言】分享一些个人C语言程序代码[大一下集合]

热门文章

  1. bzoj-1123 BLO
  2. 新想法 | 按需视觉识别:愿景和初步方案
  3. mysql 从data文件恢复数据库
  4. frameSet和iframe的基本理解
  5. Kaggle:Video Game Sales电子游戏销售分析(Tableau展示)
  6. android 百度地图驾车导航,百度地图API详解之驾车导航
  7. 3369. 三千米健身步道
  8. 洛谷 - 一些好玩的问题
  9. SASE(什么是SASE)
  10. C语言实现二、十、十六进制的相互转换