Orleans例子再进一步

步骤

       现在我想再添加一个方法,到IGrains项目内,这个方法里面有个延迟3秒,然后返回一个Task<string>.就叫做DelayedMsg吧,如下图所示:

 

 

 

       我调用了这个DelayedMsg,同时又调用了SayHello函数,看看效果:注意这个DelayedMsg的调用方法没有await.

虽然我的SayHello的调用时间紧随着DelayedMsg之后,

可是发现SayHello仍然延迟了3秒才出来,这是因为SayHello必须等待DelayedMsg方法执行完毕.如图:

 

 

这说明一件事情,就是grain接受消息是异步的。而且Grain处理消息是“单线程约束”的。

 

 

如果有两个Grain实例,一个调用DelayMsg,而另一个调用SayHello,可以发现此时的SayHello会立马执行,如图:

 

 

这又说明两个不同的Grain实例是在不同的线程执行的。

 

解释一下

好了,初步的例子就展现到此,现在来解释一下下… 

1.往Grain发送消息,实质上是调用它的接口,但是不论何时,不论何地,哪怕是不同的计算机,调用具有相同标识的Grain里的任何一个方法,这些方法都会在单一的线程中被执行。所以如果Grain有个list类型的私有字段,在操作的这个字段的时候就无需架锁。因为list根本不会出现“脏读”。所以在Orleans的世界里,消息的处理可以做到全程无锁。

2.Grain的标识:Orleans使用以下类型作为Grain的标识:Guid,Long,String,以及组合标识。在面向对象的环境中,做到严格区分一个实例和一个实例的引用,并不是很容易,有时候很容易混淆,就算混淆了对程序也不会有太大影响.在分布式的环境里想要用一个对象的引用来代表这个对象,这是做不到的.因为对象的引用只有在一定的地址空间内才有效,而在分布式的环境下,系统有可能分布在多台机器上.

 这就要求用一个新的东西来代表Grain.这就是使用标识的原因.使用标识时,Orleans要求主标识对于一个特定的grain类来说,要唯一.因此一个grain的完整标识必须时由它的类型和它的主标识组成.在实际使用的过程中,很少去关注grain的完整标识,在记录日志的时候,完整标识也许有点用.大部分时候只需要知道主标识就可以了,Orleans提供了几个方法,可以调用它们得到grain实例的主标识:在Grain类的内部,可以通过调用this. GetPrimaryKeyXXX()得到本实例的标识.而在Grain的外部,则只能通过指定主标识来往对应的对象发送消息,比如以下语句:

GrainClient.GrainFactory.GetGrain<IExample>(1) ;

   简单一句话,Orleans通过标识来区分grain的所有实例.要想使用Grain必须通过GetGrain方法得到一个对应实例的引用,再通过调用此引用的方法往对应对象发送消息.

  组合标识对应的可以继承一个IGrainWithGuidCompoundKey或者IGrainWithIntegerCompoundKey,如下所示.

public interface IExampleGrain : Orleans.IGrainWithIntegerCompoundKey

{

    Task Hello();

}

在客户端,你可以在GrainFactory.GetGrain方法中设置第二个参数. 

var grain = GrainClient.GrainFactory.GetGrain<IExample>(0, "a string!");

 为了在grain内部获得主标识,我们需要调用GetPrimaryKey 的方法.

public class ExampleGrain : Orleans.Grain, IExampleGrain

{


    public Task Hello()

    {


    string keyExtension;

        long primaryKey = this.GetPrimaryKey(out keyExtension);

        Console.WriteLine("Hello from " + keyExtension);

        return TaskDone.Done;


    }

}

3.Grain是虚拟的Actor---.Orleans的Actor模型更进一步,它是”虚拟Actor”的模型.任何时候都可以直接使用GetGrain方法得到一个Grain的引用.就好像对应的Grain对象早就创建好了,等待被人引用一样.这种表现背后的工作都由silo来完成,当你调用GetGrain<IgrainA>方法后,意图得到grainA类的一个实例的引用,silo会在服务端的内存中通过复制来激活一个grainA的实例.这个复制内存的过程在Orleans中称之为激活(activation),所以每一个grain类都可以重写一个方法就是OnActivationAsyc.在这个方法里可以实现类似于初始化的动作.

   激活一个Grain实例之后,如果长时间没有新的消息到达此实例,这个Grain也许会被反激活,进入休眠状态,这时候可以通过重写OnDeactivateAsync来干预反激活过程,大部分应该是些扫尾的工作.

   不用显式的创建和销毁一个grain对象.关于虚拟Actor的进一步讨论,会在下一篇中继续进行.

4.Grain内部如果想要发送消息给其他的Grain.必须使用类内部的GetGrain<>方法,而不能通过GrainClient.GrainFactory.GetGrain<>方法.

5.Grain可以有字段,这些字段可以是公共的,也可以是静态的.但是如果这样设计,使用者必须小心处理.

    其实在Orleans的世界里,公共字段没有太大的用处,因为你要想得到Grain的实例,必须通过GetGrain方法,而此方法返回的引用里并没有字段,而只有方法(因为是接口)…

    静态字段也许有用,比如有人想要用一个静态字段来保存所有活动的GrainA类实例,一个办法就是使用静态字段.但是这是一个麻烦的办法,因为此字段有可能”脏读”.要想有效的控制此字段的读写,就要架锁..这破坏了很多Orleans带来的好处..,简单的办法就是再创造一个grainB类型,让它的一个实例来统一管理所有的GrainA实例.这样就还是一个纯洁的Orleans世界.

 

   好了,这样简单Orleans完全体就说完了.可是这个例子还是太过于简单了.虽然体现了Orleans的系统的主要方面,但是并不是所有的关键方面.仍然是一个类似于WCF程序或者类似于RPC的框架.吃瓜群众的c#理论知识还是很丰富的.

   在orleans框架里,Grain就是对应的理论模型的actor,所以很多语境下,actor和grain是相同的.这个必须要强调下.

   为了进一步破坏吃瓜群众的阴毛..我决定弄一个稍微复杂的例子,让Orleans摆脱这些帽子.

相关文章: 

  • .NET的Actor模型:Orleans

  • 微软分布式云计算框架Orleans(1):Hello World

  • 微软分布式云计算框架Orleans(2):容灾与集群(1)

  • Aaron Stannard谈Akka.NET 1.1

  • 使用Akka.net开发第一个分布式应用

  • Orleans入门例子

原文地址:http://www.cnblogs.com/gaopang/p/7382987.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/324035.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2018/7/12-纪中某C组题【jzoj4272,jzoj4273,jzoj4274】

前言 今天我的想法都是正解&#xff0c;也都写了&#xff0c;结果才160QwQ 今日分数 去掉了十分强大的纪中dalao 正题 T1&#xff1a;jzoj4272-序章-弗兰德的秘密【树形dp】 博客链接&#xff1a;https://blog.csdn.net/mr_wuyongcong/article/details/81021994 T2&#xf…

你,下周可否“报上有名”?

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号【雄雄的小课堂】。一周一次周测&#xff0c;一直在延续&#xff0c;一般情况下不会间断。以前我只要一说&#xff0c;同学们&#xff0c;咱们本周周五考试&#xff0c;下面的同学们就沸腾的不行了&#xff0c;有的说…

Redis的3个高级数据结构

转载自 Redis的3个高级数据结构 平常接触最多的是5个入门级数据结构&#xff1a;String&#xff0c;Hash&#xff0c;List&#xff0c;Set&#xff0c;Sorted Set&#xff0c;本文介绍3个高级数据结构&#xff1a;Bitmaps&#xff0c;Hyperloglogs&#xff0c;GEO。 Bitmap…

SpringCloudConfig整合Nacos

SpringCloudConfig 的作用是可以进行配置的更新处理&#xff0c;这个的确是很好&#xff0c;但是原始的SpringCloudNetflix 架构所提供的动态的抓取配置实在是太繁琐了&#xff0c;包括还要使用到SpringCloudBus进行Actuator处理 SpringCloudAlibaba套件之中是基于Nacos 实现的…

使用VS Code开发调试.NET Core 2.0

使用VS Code 从零开始开发调试.NET Core 2.0。无需安装VS 2017 15.3即可开发调试.NET Core 2.0应用。 VS Code 全称是 Visual Studio Code&#xff0c;Visual Studio Code是一个轻量级的跨平台Web集成开发环境&#xff0c;可以运行在 Linux&#xff0c;Mac 和Windows下&#x…

jzoj3382-七夕祭【贪心,中位数】

正题 大意 有k个摊点&#xff0c;有n行m列&#xff0c;每次只能让摊点移动到相邻的格子&#xff08;如果相邻的有那么就交换&#xff09;。要求最少的移动次数让每行每列的摊点数一样&#xff0c;如果不行就输出只能做到行或只能做到列或都不行。注意最上面一行和最下面一行相…

不管什么事,只要用心做,总不会太差!

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号【雄雄的小课堂】。KTV项目基本已经做完&#xff0c;于是自上周五以来就开始挨个小组的进行试讲。上周五第一次试讲&#xff0c;只讲了三个小组&#xff0c;整体来说讲的都不行。组员与组长之间的协调不统一&#xff…

学生自定义的键盘,功能强大齐全!!!

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注公众号&#xff1a;雄雄的小课堂。今天给大家介绍一款键盘&#xff0c;本款键盘属于私人订制&#xff0c;“专业性”很强&#xff0c;且功能齐全&#xff0c;在使用时可以一人使用&#xff0c;在某种特定的场合下&#xff0c;两…

jzoj3383-太鼓达人【欧拉回路,位运算】

正题 大意 一个数K&#xff0c;求一个最长的01环形序列&#xff08;头和尾相连&#xff09;&#xff0c;使得每个长度为k的连续子序列都不相同。&#xff08;要输出这个串&#xff0c;如果有多个答案输出字典序最小的&#xff09; 解题思路 尝试将长度为k的01序列全排列一下我…

度量.net framework 迁移到.net core的工作量

把现有的.net framework程序迁移到.net core上&#xff0c;是一个非常复杂的工作&#xff0c;特别是一些API在两个平台上还不能同时支持。两个类库的差异性,通过人工很难识别全。好在微软的工程师们考虑到了我们顾虑&#xff0c;为我们提前设计了一个工具&#xff1a;.NET Port…

深入理解Java ClassLoader及在 JavaAgent 中的应用

转载自 深入理解Java ClassLoader及在 JavaAgent 中的应用 背景 众所周知, Java 或者其他运行在 JVM(java 虚拟机)上面的程序都需要最终便以为字节码,然后被 JVM加载运行,那么这个加载到虚拟机的过程就是 classloader 类加载器所干的事情.直白一点,就是 通过一个类的全限定…

如何从Gitee中拉取项目到HBuilder中?

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。今天&#xff0c;给大家分享一下&#xff0c;如何使用HBuilder连接gitee&#xff0c;进行代码的提交&#xff08;明天在看&#xff09;与拉取。1首先&#xff0c;在HBuilder中下载Git的插件…

jzoj3384-理工男【欧拉定理,gcd,数论】

正题 大意 给出一个分数ABAB求它在k进制下的小数循环。 如果是有限小数直接输出位数 无限循环输出混循环节和循环节长度。 代码 直接切正题 用a数组表示每一位的余数&#xff0c;然后a[0]Aa[0]A&#xff0c;之后a[1]a[0]∗K%Ba[1]a[0]∗K%B&#xff0c;然后如果有q位那么a…

ASP.NET Core Razor页面 vs MVC

作为.NET Core 2.0发行版的一部分&#xff0c;还有一些ASP.NET的更新。其中之一是添加了一个新的Web框架来创建“页面”&#xff0c;而不需要复杂的ASP.NET MVC。新的Razor页面是一个比较简单的MVC框架版本&#xff0c;在某些方面是老的“.aspx” WebForms的演变。 在本文中&a…

Gradle 简单使用

文章目录创建Gradle项目dependencies.gradlegradle.propertiesbuild.gradleGradle配置文件详解dependency-management 插件SpringBootPlugin 插件多模块热部署创建Gradle项目 dependencies.gradle ext.versions [ // 定义所有要使用的版本号springboot: 2.4.1 // Spri…

Nginx可以做什么?看完这篇你就懂了

转载自 Nginx可以做什么&#xff1f;看完这篇你就懂了 本文只针对Nginx在不加载第三方模块的情况能处理哪些事情&#xff0c;由于第三方模块太多所以也介绍不完&#xff0c;当然本文本身也可能介绍的不完整&#xff0c;毕竟只是我个人使用过和了解到过得&#xff0c;欢迎留言…

如何将HBuilder中的项目Push至Gitee中!

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。昨天&#xff0c;给大家介绍了下HBuilder中怎么从gitee中拉取项目至本地&#xff0c;需要的小伙伴们可以点击链接查看&#xff1a;如何从Gitee中拉取项目到HBuilder中&#xff1f;今天&…

jzoj3385-黑魔法之门【并差集】

正题 大意 一个图有n个点&#xff0c;每次增加一条边。每次增加一条边之后统计每个点度数大于0且是偶数的子图个数。 解题思路 首先满足要求的子图至少有一个环&#xff0c;然后我们考虑每加入一个环和别的环的判断情况。每加入一个环的话我们会发现其实就是有若干个环之中选…

PLEASE小组KTV点歌系统简要说明

PLEASE小组KTV项目指导老师&#xff1a;穆老师 班主任&#xff1a;佟老师小组成员&#xff1a;组长&#xff1a;徐祥 副组长&#xff1a;孟祥帅组员&#xff1a;董经纬 组员&#xff1a;孙晓文 周航 组员&#xff1a;徐龙一 张远远制作周期&#xff1a;2021年6月25日…

(选择 冒泡 插入 二分 异或)

文章目录选择排序冒泡排序插入排序二分二分查找某个数是否存在在arr上&#xff0c;找满足大于等于value的最左位置在arr上&#xff0c;找满足小于等于value的最右位置局部最小值异或选择排序 O(n^2) public class Code01_SelectionSort {public static void selectionSort(in…