Actor模式初步入门

     从实习到现在,一直在做Unity相关的业务,不知不觉中感觉已经不在关注服务器相关的技术了。一次偶然的机会再腾讯的gad平台上观看了云风在15年在腾讯做的skynet讲座(http://gad.qq.com/content/coursedetail/467),skynet是用c写的核心,lua做上层业务,基于actor模型的服务器框架,哈哈,这次学习actor模式的学习也是因此而起。

Actor模型概念

     Actor模型为并行而生,简单说是未解决高并发的一种编程思路。在Actor模型中,主角是Actor,类似一种worker,Actor彼此之间直接发送消息,不需要经过什么中介,消息是异步发送和处理的。在Actor模式中,“一切皆是Actor”,所有逻辑或者模块均别看做Actor,通过不同Actor之间的消息传递实现模块之间的通信和交互。Actor模型描述了一组为了避免并发编程的常见问题的公理:

     1.所有Actor状态是Actor本地的,外部无法访问。
2.Actor必须只有通过消息传递进行通信。
3.一个Actor可以响应消息:推出新Actor,改变其内部状态,或将消息发送到一个或多个其他参与者。
4.Actor可能会堵塞自己,但Actor不应该堵塞它运行的线程。

    

Actor优点、缺点分析

     传统的并发编程方式大都使用“锁”的机制,相信大多数都是”悲观锁“,这里几乎可以断定会出现两个明显的问题:

    1.随着项目体量增大,业务愈加复杂,不可避免大量使用“锁”,然而大家都知道“锁”的机制其实很耗性能的,所以大量使用锁的机制肯定会造成效率不高

    2.即使大量依赖“锁”解决了系统中资源竞争的情况,但是由于没有一个规范的编程模式,最后系统的稳定性肯定会出问题,最根本的原因是没把系统的任务调度抽象出来,由于任务调度和业务逻辑的耦合在一起,很难做一个很高层的抽象,保证任务调度有序。

    3.难以维护等等弊端

上面是传统通过“锁”的机制实现并发编程的缺点,然而Actor为什么一定层度上可以解决这些问题呢?个人认为其最根本的原因是Actor模式下提供了一种可靠的任务调度系统,也就是在原生的线程或者协程级别上做了更高层次的封装。这会给编程模式带来巨大的好处:

    1.由于抽象了任务调度系统,那么就可以使系统的线程调度可控,易于统一处理,稳定性和可维护性好

    2.作为开发者我们只需要关心每个Actor的逻辑就可以了,避免“锁”的“滥用”

    3.Actor也提供了很多基本准则,避免了很多并发编程中的问题 

    ……

那么Actor没有缺点吗?那也不是,比如当所有逻辑都跑在Actor中时,很难掌控Actor的粒度,稍有不慎就可能造成系统中Actor个数爆炸的情况,Actor当出现必须共享数据或者状态时就很难避免使用“锁”,但似乎由于上面的“Actor可能会堵塞自己,但Actor不应该堵塞它运行的线程”准则冲突,哈哈,这个时候也许可以选择使用redis做数据共享

时间: 2024-10-29 08:08:54

Actor模式初步入门的相关文章

【Android 初学】7、相对布局--初步入门

Start Android  1.什么是相对布局() 相对布局是另外一种控件的摆放的方式: 相对布局是通过指定当前控件与兄弟控件或是父控件之间的相对位置,从而达到控制控件位置的目的: 2.为什么要使用相对布局 相对布局的UI性能比线性布局(嵌套太多)更好: 3.相对布局的常用属性 RelativeLayout用到的一些重要的属性: 第一类:属性值为true或false     android:layout_centerHrizontal  水平居中     android:layout_cent

十分钟理解Actor模式

Actor模式是一种并发模型,与另一种模型共享内存完全相反,Actor模型share nothing.所有的线程(或进程)通过消息传递的方式进行合作,这些线程(或进程)称为Actor.共享内存更适合单机多核的并发编程,而且共享带来的问题很多,编程也困难.随着多核时代和分布式系统的到来,共享模型已经不太适合并发编程,因此几十年前就已经出现的Actor模型又重新受到了人们的重视.MapReduce就是一种典型的Actor模式,而在语言级对Actor支持的编程语言Erlang又重新火了起来,Scala

Java反射-初步入门

Java反射-初步入门 学反射先了解什么是反射. 百度百科:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 上面提到了类和对象,先了解什么是类和对象. java中类: 1.抽象描述 类:类是客观存在的.抽象的.概念东西. 对象:对象是具体的,指一个具体的东西. 打比方:饮料是一个类,可乐.雪碧就是对象. 总结一句话:类是对象的模版,对象

Shel脚本-初步入门之《02 什么是 Shell 脚本》

Shel脚本-初步入门-什么是 Shell 脚本 2.什么是 Shell脚本 当命令或程序语句不在命令行下执行,而是通过一个程序文件来执行时,改程序就被称为 Shell 脚本.如果在 Shell 脚本里内置了很多条命令.语句及循环控制,然后将这些命令一次性执行完毕,这种通过文件执行脚本的方式称为非交互式的方式.这些命令.变量和流程控制语句等有机地结合起来,就形成了一个功能强大的 Shell 脚本. 范例1: 清除 /var/log 下 messages 日志文件的简单命令脚本 把所有命令放在一个

大三开学第一天--编译原理和人工智能的初步入门

开学的第一天,学的都是入门,所以知识比较少,但是我还是会整理出来.因为是开学第一天,事情比较忙,知识没有得到很好的消化和了解,所以今天只作初步了解,过几天会找时间重新整理,具体化. 编译原理第一课: 编译器:编译器是一种语言处理器,可以将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”.通俗的讲,就是我们目前所使用的高级语言,如C++,java,都是易于人们理解和编写的.但是对于机器来说,只能看懂机器语言(即汇编语言,属于低级语言).所以,人们用高级语言写出来的代码,首先要经

Hadoop单机模式安装入门(Ubuntu系统)

闲来无事,突然看到关于Hadoop集群.以前也了解过,网上找过一些关于百度,谷歌等底层hadoop集群的文档,可是面对很多陌生的技术,看不太通透.所有想自己动手虚拟机试试.经常听到这么高大上的名词,Hadoop已经成为大数据的代名词.短短几年间,Hadoop从一种边缘技术成为事实上的标准.而另一方面,MapReduce在谷歌已不再显赫.当企业瞩目MapReduce的时候,谷歌好像早已进入到了下一个时代. Hadoop支持三种启动集群模式,分别是单机模式,wei分布式模式,安全分布式模式.下面我做

备忘录模式设计模式入门Memento

//备忘录模式定义: //在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态. //这样以后就能够将该对象恢复到原先保存的状态 //实例:測试两种方案.两种方案在第一阶段的过程是同样的,第二阶段是不同的 //实例代码 //备忘录对象的窄接口 public interface FlowAMockMemento { //空的,所谓窄接口,即仅仅是一个标识作用,它的持有者不能够调用不论什么它的方法 } //測试流程类 public class FlowAMock { priva

《开源框架那点事儿23》:Tiny模板语言(VelocityPlus)初步入门

2 Tiny模板语言概述 3 Tiny模板语言能为您做什么? 4 Tiny模板语言简介 5 Hello Tiny! 6 注释 7 引用(References) 7.1 变量(variables) 7.2 属性(properties) 7.3 方法(methods) 8 表达式(Expression) 8.1 取值表达式 8.2 Map常量 8.3 数组常量 8.4 其他表达式 9 索引表示法 10 渲染 11 与Java无缝对接 12 模板布局 13 指令集 13.1 #set指令 13.2 条

Tiny模板语言(VelocityPlus)初步入门

1 关于用户手册 本文主要介绍如何在模板中使用Tiny模板语言,通过查阅本手册,可以对Tiny模板语言 TTL(Tiny Template Language)的用法有一个较全面的认识,并学会如何有效地使用Tiny模板语言.同时,本文提供了较多的例子帮您来学习并掌握它. 2 Tiny模板语言概述 Tiny 模板语言是一个参考Velocity语法的模板语言,它对Velocity模板语言中一些功能不太完全及使用过程中比较不方便的地方进行全面的扩展和升级,同时为了更好的适应Web界面层的开发,还提供了强