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的单线程执行模型的更多相关文章

  1. 从JavaScript的单线程执行说起

    先看一段代码: 1 2 3 4 5 setTimeout(function(){     alert("a"); }, 0); while(1); alert("b&qu ...

  2. CLR via C# 摘要一:托管程序的执行模型

    托管程序的执行模型大致如下: 编译源代码为程序集(dll或exe文件),程序集包括了记录相关信息的元数据和IL代码 执行程序集文件时,启动CLR,JIT负责把IL编译为本地代码并执行 IL是微软推出的 ...

  3. CLR执行模型

    好好学习底层运行机制,从CLR via C# 开始. CLR的执行模型: CLR:Common Language Runtime,是一个可由多种编程语言使用的"运行时".CLR的核 ...

  4. ASP.NET执行模型之IIS服务器处理流程

    之前在网上看过很多对这方面的讲解,但个人觉得看下来过于 "深奥",不容易理解,所以想用更简单的方式进行阐述,便于理解. 本次我们重点分析用户请求到页面呈现过程中Web服务器的处理过 ...

  5. Windows Phone 执行模型概述

    Windows Phone 执行模型控制在 Windows Phone 上运行的应用程序的生命周期,该过程从启动应用程序开始,直至应用程序终止. 该执行模型旨在始终为最终用户提供快速响应的体验.为此, ...

  6. 【Framework】HTTP运行期与页面执行模型

    HTTP运行期 HTTP运行期处理客户端应用程序(例如Web浏览器)进入的一个Web请求,通过处理它的应用程序的适当组件路由请求,然后产生响应并发回提出请求的客户端应用程序. 进入的HTTP Web请 ...

  7. 01.由浅入深学习.NET CLR 基础系列之CLR 的执行模型

    .Net 从代码生成到执行,这中间的一些列过程是一个有别于其他的新技术新概念,那么这是一个什么样的过程呢,有什么样的机制呢,清楚了这些基本的东西我们做.Net的东西方可心中有数.那么,CLR的执行模型 ...

  8. CLR 的执行模型(2)

    第一章 CLR 的执行模型(2) 本篇内容大纲 Framework 类库(Framework Class Library , FCL) 通用类型系统(Common Type System,CTS) 公 ...

  9. 第一章 CLR 的执行模型

    CLR via C# 读书笔记:第一章 CLR 的执行模型(1) 第Ⅰ部分CLR基础.这部分为三章(第一章:CLR的只想能够模型,第二章:生成.打包.部署和管理应用程序及类型,第三章:共享程序集和强命 ...

随机推荐

  1. maximo弹框设置新的功能测试总结

    先介绍下弹框前的准备工作: 1.签名选项——定义系统中可授权的所有功能的唯一标识.定义签名选项是为了授权而已.定义的签名名要和相应的bean类中的方法一致. 2.签名选项中的功能实现,一般都在APPB ...

  2. MFC CFileDialog用法例子。

     Set it to TRUE to construct a File Open dialog box. Set it to FALSE to construct a File Save As dia ...

  3. Autofac 的属性注入方式

    介绍 该篇文章通过一个简单的 ASP.NET MVC 项目进行介绍如何使用 autofac 及 autofac 的 MVC 模块进行依赖注入.注入方式通过构造函数.在编写 aufofac 的依赖注入代 ...

  4. Brn系列商城4.1正式发布,欢迎大家下载体验

    此次升级内容如下: 独立IP搜索策略 独立文件上传策略 添加退换货功能 重构支付方式 常规性修复和改进 下载地址:http://www.brnshop.com

  5. javascript动态添加本地文件列表信息

    工作需要做了一个动态添加列表页面的小demo.用到了杂七杂八的javascript小知识. 而且并没有涉及到工作中的具体情境.有些通用,所以暂且罗列到这里.以后需要的时候可以直接拿来用. 看源码总是让 ...

  6. 修改navigationbar右侧按钮离屏幕边缘位置

    先上代码 UIButton *settingBtn = [Utils creatCustomButtonWithFrame:CGRectMake(, , , ) btnTitle: titleColo ...

  7. MSVC 报错 unable to use inline in declaration get error C2054

    晚上用cmake生成了一份lua-cjson的工程文件,msvc6的 编译时报错 后来再stackoverflow找到答案:unable to use inline in declaration ge ...

  8. 基于Jquery-ui的自动补全

    1.添加CSS和JS引用 <script type="text/javascript" src="javascript/jquery-1.7.min.js" ...

  9. dede channelartlist 中引用channel 并且设置当前选择类的样式,currentstyle暂时没有效果.特发求助!!!!

    在dede中需要达到当前选择了该类,样式不同的话.如果是channelartlist 的话. 可以使用下面的情况: {dede:channelartlist typeid='6' row='3' cu ...

  10. Practice:输入年月日,判断该时间为一年的第几天

    #-*- coding:utf- -*- ''' Created on -- # 输入年月日,判断为一年的第几天 @author: AdministrInputator ''' def leapYea ...