Orleans的单线程执行模型
Orleans在默认情况下只创建一个grain的实例,并以单线程模型执行。如果同一个grain实例,在Orleans存在多个实例,就会产生并发冲突,单线程执行模型就可以完全避免并发冲突了。
但在特殊场景下,有些实例是需要创建多个实例或者以非单线程的执行方式来满足性能的需要;
如何支持创建多个实例
对于了解负载均衡的人,如果web服务器支持无状态(分布式Sesson或者cookie身份识别),会很容易做负载。同样的,对于grain来说,如果是无状态的,那么在系统中创建任意多的实例都是一样的,不存在状态不同步的问题。
那么如何在Orleans支持这样的grain呢?
Orleans提供了[StatelessWorker]的Attribute,标记为StatelessWorker的,Orleans会自动调整该grain的实例数量来满足系统的需要。而对于标记为StatelessWorker的Grain,一般只是根据参数调用其它的grain行为,自身没有也不需要保持任何状态。
当标记为StatelessWorker的Grain实例数量不足以应对当前系统的处理请求时,Orleans会自动在cluster中的其它Silo(grain的宿主容器)创建新的Grain实例,用以满足系统的处理需求。当系统热点过去后,如果该Grain一直闲置,是对系统资源的一种浪费,Orleans会自动释放这些闲置的Grain占用的资源。这种方式很像云计算中的弹性云计算的方式。
如何支持非单线程执行模式
分布式应用程序的本质是并行,但是并行带来了更多的复杂性。有两个方式可以降低这种复杂性
1.对Actor实例的内部状态以单线程方式访问
2.Actor之间不共享任何数据,仅仅通过消息进行交互
单线程的数据访问,避免了数据征用,大大降低了分布式应用的复杂性。所以Orleans默认是单线程的执行模式。但这种执行模式,也带来了死锁发生的可能性。
比如A发消息给B,等待B的响应
B收到消息后,又发消息给A,B开始等待A的响应
A由于正在等待之前发给B消息的响应,而无法处理B新发来的消息
A和B之间相互等待,产生了死锁。
而对于A和B之间2次消息并不会产生并发冲突,对于这样的,Orleans提供一种方式,允许grain以非单线程的模型执行。 [Reentrant] Attribute,标记了这个属性的Grain允许多次进入,但此处并非脱离了grain的单线程执行模型。graincode仍然运行在单线程模型下,只是允许请求交错执行。
标记了[Reentrant]之后,我们在看之前A B的示例。
A发消息给B,等待B的响应
B收到消息后,又发消息给A,B开始等待A的响应
A因为标记了[Reentrant] ,可以接受并处理B发来的消息,A处理完毕后发回响应给B
B收到响应后,完成自己的处理过程,返回响应给A,完成整个调用
Orleans的单线程执行模型的更多相关文章
- 从JavaScript的单线程执行说起
先看一段代码: 1 2 3 4 5 setTimeout(function(){ alert("a"); }, 0); while(1); alert("b&qu ...
- CLR via C# 摘要一:托管程序的执行模型
托管程序的执行模型大致如下: 编译源代码为程序集(dll或exe文件),程序集包括了记录相关信息的元数据和IL代码 执行程序集文件时,启动CLR,JIT负责把IL编译为本地代码并执行 IL是微软推出的 ...
- CLR执行模型
好好学习底层运行机制,从CLR via C# 开始. CLR的执行模型: CLR:Common Language Runtime,是一个可由多种编程语言使用的"运行时".CLR的核 ...
- ASP.NET执行模型之IIS服务器处理流程
之前在网上看过很多对这方面的讲解,但个人觉得看下来过于 "深奥",不容易理解,所以想用更简单的方式进行阐述,便于理解. 本次我们重点分析用户请求到页面呈现过程中Web服务器的处理过 ...
- Windows Phone 执行模型概述
Windows Phone 执行模型控制在 Windows Phone 上运行的应用程序的生命周期,该过程从启动应用程序开始,直至应用程序终止. 该执行模型旨在始终为最终用户提供快速响应的体验.为此, ...
- 【Framework】HTTP运行期与页面执行模型
HTTP运行期 HTTP运行期处理客户端应用程序(例如Web浏览器)进入的一个Web请求,通过处理它的应用程序的适当组件路由请求,然后产生响应并发回提出请求的客户端应用程序. 进入的HTTP Web请 ...
- 01.由浅入深学习.NET CLR 基础系列之CLR 的执行模型
.Net 从代码生成到执行,这中间的一些列过程是一个有别于其他的新技术新概念,那么这是一个什么样的过程呢,有什么样的机制呢,清楚了这些基本的东西我们做.Net的东西方可心中有数.那么,CLR的执行模型 ...
- CLR 的执行模型(2)
第一章 CLR 的执行模型(2) 本篇内容大纲 Framework 类库(Framework Class Library , FCL) 通用类型系统(Common Type System,CTS) 公 ...
- 第一章 CLR 的执行模型
CLR via C# 读书笔记:第一章 CLR 的执行模型(1) 第Ⅰ部分CLR基础.这部分为三章(第一章:CLR的只想能够模型,第二章:生成.打包.部署和管理应用程序及类型,第三章:共享程序集和强命 ...
随机推荐
- Easyui修改样式
背景:公司一个后台管理系统做的网站,构架采用Asp.net MVC4.0 + EasyUI, 请了美工做了切图,结果发现美工不懂Easyui,切图的风格又都是直角风格. 而Easyui默认风格是圆角. ...
- 多个 git ssh key 配置 Ubuntu os
1.生成ssh key: ssh-keygen -t rsa -C “email@sss.com” 此时,在~/.ssh/文件夹下会有两个文件, id_rsa 和 id_rsa.pub.分别保存ssh ...
- html中的块元素(Block)和内联元素(Inline)(转)
我们首先要了解,所有的html元素,都要么是块元素(block).要么是内联元素(inline).下面了解一下块元素.内联元素各自的特点: 块元素(block)的特点: 1.总是在新行上开始:2.高度 ...
- 用Javascript取float型小数点
用Javascript取float型小数点后两位,例 var a = 12.2369826取成12.23,如何做?下面四种方法可用 (1) var str = a.substring(0,s. ...
- SQL in与exists
无可置疑,如果in()的结果集非常庞大,那么效率必然是低的. 但EXISTS subquery根据其语法可知在SQL中的作用是:检验查询是否返回数据.如果在 Dictionary 对象中指定的关键字存 ...
- 亚马逊开放机器学习系统源代码:挑战谷歌TensorFlow
北京时间5月17日上午消息,亚马逊在开源技术领域迈出了更大的步伐,宣布开放该公司的机器学习软件DSSTNE的源代码.这个最新项目将与谷歌的TensorFlow竞争,后者已于去年开源.亚马逊表示,在缺乏 ...
- Select查询语句2
一.模糊查询 1.语法结构 select*from table_name where column like '%context%' 在使用like运算符时如果不使用通配符“%”,则like的作用与= ...
- [转]理解dropout
理解dropout 原文地址:http://blog.csdn.net/stdcoutzyx/article/details/49022443 理解dropout 注意:图片都在github上 ...
- LVM基本概念、管理
一.传统磁盘管理的问题 当分区大小不够用时无法扩展其大小,只能通过添加磁盘.创建新的分区来扩充空间,但是新添加进来的硬盘是作为独立文件系统存在的,原有的文件系统并未得到扩充,上层应用很多时候只能访问一 ...
- 20145225《Java程序设计》 2015—2016年学期课程总结
20145225<Java程序设计> 2015—2016年学期课程总结 读书笔记链接汇总 1.2016年2月25日 <Java程序设计>课程准备之问卷调查 摘要: 一.你对自己 ...