Orleans—一些概念

这个文章聊一聊Orleans的概念.以下文章大部分翻译自官方教程,还有一些结合实际的应用经验,并对以前文章留下的坑进行填平.如果有哪个坑没有填,还请告诉我.

Grain的生命周期:

    一个Grain在逻辑上是永远存在的,并在逻辑上拥有一个不变的标识.程序的代码永远不会去创造或者销毁一个Grain,你可以认为Grain永远存在于内存中,就等着响应你的请求.当然在物理上,按照需求由Orleans运行时自动的激活一个Grain,如果这个Grain在某一个时间段空闲,它也由Orleans自动的反激活,并从内存中移除.一个Grain的激活与反激活从程序代码上捕捉不到的,程序代码只可以从Grain类本身提供的两个方法参与其中,它们是OnActivateAsync , OnDeactivateAsync.除此之外Grain的一生就处于反激活或者激活状态,但是不管何时,你都可以假定Grainsilo里存在,放心大胆的激活它.    激活一个Grain,只能通过GetGrain方法,这个方法只有在GrainClientGrain类内部提供.通过这个方法,我们只能得到一个grain的引用,这个引用不是Grain的物理地址,而是GrainOrleans体系中的一个逻辑地址.这个引用对于特定的实例是唯一不变的.并且不会两两相同.

消息

    我们调用Grain引用的方法,实质上是给一个特定的grain实例发送消息,默认Orleans体系保证消息的到达目的地是"至多一次".也就是说如果一个消息因为网络问题发送失败了,Orleans不会重新发送.这时候需要在程序代码中做额外的判断与处理.

单线程机制

    一个消息到达了一个特定的grain实例,这个grain实例把这个消息翻译成一个task,然后会调用自己内部的TaskScheduler(任务排程器),把这个消息放入到特定的队列.等待执行.Orleans的内部其实是使用了一个自定义的TPL,这个TPL本质上也是通过标准的TaskScheduler来工作的.从宏观上说,Orleans体系内的TaskScheduler有两类,一类是全局的TaskScheduler,一类是Grain实例内部的TaskScheduler.

    一个Task,Orleans里也称作是workItem,有时候会在日志中看到WorkItem XXX等等内容,可以这样简单的认为,消息 task workItem,是一个消息在不同的阶段的不同的名字.

在类实例内部的TaskScheduler,workItem排队等待被执行.由于一个队列中WorkItem也许会排多个,所以它们这多个又被称为WorkItemGroup.

这样每个Grain实例中过的WorkItemGroup,又会在全局中的TaskScheduler里排队.这个全局的TaskScheduler管理着这些WorkItemGroup组成的队列(即队列的队列).

同时全局的TaskScheduler还管理着一组线程.并给每一个WorkItemGroup安排一个线程执行WorkItemgroup里载明的WorkItem.在统一时间段,一个WorkItemGroup只安排一个线程.

这样构成了一个"单线程机制".

一个Task,永远会被安排到正确的队列中.Orleans永远不会在执行Task的中途创造另一个Task,所以要求程序代码在执行Task的中途,不要开辟多线程.不然会报错或者会破坏单线程机制.如果真的有需要创造额外的task.可以使用一个变量,获取当前的TaskScheduler.在启动这个额外的task,指定这个变量作为参数.其他时候,最好永远不要再grain内部开辟新的线程.其实用久了你会发现,大部分时候根本不需要线程...啥是线程?能吃吗?啥是锁,能做我女朋友吗?虽然这是嘻话,但是,了解锁和了解线程对Orleans的编程还是很有帮助的,比如怎么给Orleans破处,破除它的单线程机制(虽然平时用不到)等等奇淫巧技,对于有女朋友的码农们还是很容易做到的.所以还是早点找到女朋友.

跑远了,上文说到 消息,task,以及workitem可以认为是消息在不同阶段的不同表现形式.那么Orleans是如何做到Orleans客户端与Orleans服务端通信的呢?Orleans底层是用的tcp协议.Orleans在编译阶段会产生额外的代码,同时在运行阶段,也会产生一些代码,这些代码的作用是为了支持发送消息,包括消息的序列化等等一些复杂的概念.前一段时间有新闻说程序员写了一个程序,这个程序是可以自动写代码的…现在我们也用上了,咩哈哈哈…还依然是码农.

Grain目录服务

消息一旦到达silo,就会触发一个Grain的激活(如果之前没有激活过.)这个激活的动作,是在集群内部随机发生的.也就是说,Grain实例产生的物理位置是随机的.Orleans系统维持了一个变量,名字叫做ActivationCountPlacement,它使用这个变量尝试在集群的各个silo之间平衡激活发生的次数.Orleans还使用了分布式hash表的技术,构建了3.    Grain Directory service(Grain目录服务),如果你不是很优雅的关闭silo,会在日志中看到这个目录.如下图

这就要求我们在关闭silo的时候调用正确的函数,特别是在需要存储grain状态的情况下.

我一般是使用以下方式关闭一个silo

以前的文章说过允许Grain在接收消息的时候稍微富有弹性,不是刚性的遵循"单线程机制".这个富有弹性的机制就是[reentrant]特性,上文已经说过了.但是这个特性带来的好处的同时(好处就是稍微防止了一下消息死锁),也带来的坏处,坏处就是在实现EventSourcing的时候,它会稍微的破坏一致性.这个在这里只是一提.不做展开.在合适的时候会做说明.

状态无关的Grain

关于Grain,在Orleans中还有一个概念就是StatelessWorker特性,这个特性标志一个Grain是无状态的(但是可以有字段保存需要的信息).意思就是启动StatelessWorker任意多个,都不会感到它们之间有何区别.大家都看过黑客帝国吧.哪个特工史密斯在大雨中复制了自己好多个..没错,就是那种感觉.这样的Grain无论多少个,都他X的是克隆体,所以Orleans处理它的时候与普通的Grain不太一样.(这个StatelessWorker特性也标明了,这种grain就是工人,纯干活的,就是工具类,与状态无关的),区别是1.可以在集群的多个silo里,每一个silo都创造一个相同标识的Grain.2.针对此类grain的请求,都只在第一个接受到请求的silo里执行.(即请求不会跳转,在一个集群里,如果你请求一个普通的GrainA,假设标识是123,这个请求的消息也许发往了siloA,但是这个123的实例已经在另一个的siloB里已经被创建了,这样针对123的请求必须跳转到此siloB.)3.Orleans会在所有此类grain忙的时候,自动增加一个...实际应用中,会利用特性2,加快请求的处理速度.也可以利用特性1,让StatelessWorker在自己的字段里携带一些常用的数据,在整个集群中扩散.

注意状态无关并不是无状态值.

Observers通知

经过了以上的介绍,也许早就有人想到了.所有的消息是从client到silo.如何让消息从silo到client?Orleans提供了两个办法(当然你也可以利用TCP等协议自己实现一个),一个简单点,一个复杂点.当然这是我自己的观点.

简单点的办法就是使用observer,见多识广的人已经猜到了Rx这种反应式通知机制.我就认识一个真Rx高手.对Rx的理解非常之深刻,不过Orleans只是借用了它的思想和部分方法.observer是消息从silo到client的一种异步机制.并且是单向的.(即silo不期待任何返回值),官方的例子中有两个例子展示了如何使用observer.其中有个例子是chirper.可以去观摩观摩.

还有个复杂点的通知机制就是stream,所谓流.或许下一步我应该把流加入我的话题列表内.Orleans真是一个严肃的框架,它替我们完成了几乎所有底层的工作,而且设计巧妙,让我们只需要关注生产实际.而之前介绍的文章中,并没有真正详细介绍如何构建一个可以横向扩展的集群.虽然已经说过一个主从模式的silo集群,但是哪个集群太过于脆弱.不是真正的服务自我发现式的,灵活的集群..下面一个文章我就说说,如何构建一个Orleans的silo集群.这个集群满足以下特性:

  1. 服务自我发现.

  2. 后加入的silo可以被集群接纳

  3. 离线的silo可以被集群排除

  4. Orleans客户端可以充分利用集群内在线的silo

如果能够满足以上特点,可以认为这个集群能够应用于生产实际当中.

今天说的内容,没有什么实用性的内容.但是这些概念每个都值得好好研究,我这里只是引路.

相关文章: 

  • .NET的Actor模型:Orleans

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

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

  • Aaron Stannard谈Akka.NET 1.1

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

  • Orleans入门例子

  • Orleans例子再进一步

  • Orleans稍微复杂的例子—互动

  • Orleans简单配置

  • Orleans配置---持久化

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


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

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

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

相关文章

使用jdbc连接mysql数据库代码示例

“大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂。”最近,正好在看jdbc,于是就整理了一份增删改查的案例,记录记录,以备后用!!java编辑器:myeclipse![10]…

POJ1958-Strange Towers of Hanoi【递推】

正题 题目链接:http://poj.org/problem?id1958 大意 有4根柱子的汉诺塔,有n个盘,求移动次数 解题思路 首先我们定义只有三根柱子时有n个盘的话移动次数是dndn,然后dndn−1∗21dndn−1∗21定义有四根柱子时有n个盘移动次数为fn…

[上海站] 微软Azure AspNetCore微服务实战

活动介绍 2017官方发布了EshopOnContainers的微服务项目,其结合了.Net Core、Azure、Docker等众多优秀的技术,为开发者们抛砖引玉,走进微服务的大门。 本次分享,我们将结合实际毫无保留的从代码上解析微服务架构,以实…

汇编语言(十九)之删除数组中的元素

在数组中删除所有-1元素,然后输出删除后的长度 程序运行: 代码: datas segmentLink dw 15 ,1,2,3,4,5,6,-9,-1,3,4,5,3,-1,-2,3ouput db Link length:$ datas endsstacks segment stackdb 100h dup(?)stacks endscodes segmentassume cs…

Linux+.NetCore+Nginx搭建集群

本篇和大家分享的是LinuxNetCoreNginx搭建负载集群,对于netcore2.0发布后,我一直在看官网的文档并学习,关注有哪些新增的东西,我,一个从1.0到2.0的跟随者这里只总结一句话:2.0版本,api更多&…

老师 累了,我们 泪了!

“以下文章来自一位不愿意透露姓名的同学所写:”呀呼 “老穆头” 没错是我们的穆老师悄悄往我们班探了探头瞧了瞧我们, 我们依旧对他那么热情,紧随其后老佟往门口一站 教室里立马严肃起来 她是我们级部出了名没人敢惹的老佟(佟老…

汇编语言(二十)之分类统计字符个数

输入一串字符串,分别统计英文字符,数字字符和其他字符的个数 程序运行: 代码: datas segmentline_max_length db 0ffhline db 0, 100h dup(?)letter_count dw 0digit_count dw 0other_count …

.NET Core+Selenium+Github+Travis CI =amp;gt; SiteHistory

前言 总是三分钟热度的我折腾了一个可以每天自动截取指定网站页面并保存到Github的项目SiteHistory,感觉挺好(每次都这样 frameborder"0" scrolling"no" style"border-width: initial; border-style: none; width: 25px; height: 26px;&qu…

汇编语言(二十一)之数值交换与自增

输入两个数,如果第一个数为偶数第二个数为奇数,互换位置;如果两个数都是奇数,则两个数都加一 程序运行: 代码: datas segmentA dw 0 B dw 0a_string db 0ffh, 0 ,100h dup(?)b_string …

2021 程序媛跳槽记:学习计划篇(已收获字节等offer)

今天推荐的这篇文章是一位互联网程序媛写的跳槽日记。她本硕毕业于985计算机专业,先后就职于央企和BAT。这一篇就是她跳槽到互联网的学习笔记,希望能对大家有所帮助,感兴趣的读者也可以关注公众号,听听更多程序媛的故事~ 坦白说&a…

Orleans的集群构建

听闻一周前,微软公布了.net core2.0,以及各种各样的其他core2.0.大家都很兴奋.微妈的诚意真是满满的.这次开源势头让我感觉到了微妈的技术实力之雄厚.我在这里祝福C#越来越好.细心的人似乎发现Orleans在github中是和net core分在一起的.Orleans的2.0何时发布呀… 现在我们面对…

汇编语言(二十二)之统计减去奇数的个数

输入一个正数,该数减去递增奇数(从1开始)直至小于等于零为止,计算该数减去奇数的个数 程序运行: 代码: datas segmentNUM dw 17ANS dw 0NUM_string db 0ffh, 0 ,100 dup(?)inputNUM …

.NET Core 在程序集中集成Razor视图

前言 有时候,我们在开发一个程序集供其他项目引用的时候,可能需要对外输出一些HTML的结构数据。 还有一些情况我们可能开发的是一个中间件,这个中间件需要提供一些界面来对外展示数据或者是内部的一些程序的运行信息,这个时候我…

开学一月,可以自己玩自己做的游戏了!!!

“大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂。”《趣味小游戏》的书已经讲完了,国庆假期给同学们布置了小游戏项目的任务,开学时检查了下,大部分做的还是挺不错的。有的同学超常发挥想象&#xff0…

汇编语言(二十三)之求一个数的补数

给定一个数,求该数的补数 程序运行: 代码: datas segmentNUM DB 12H,34H,56H,78H,9AH,0BCH,23H,45HDB 67H,89H,0DEH,13H,24H,35H,46H,57HN DB $-NUMoutputNUM db "orignal data NUM$"outputNUMC d…

ASP.NET Core 防止跨站请求伪造(XSRF\/CSRF)攻击

什么是反伪造攻击? 跨站点请求伪造(也称为XSRF或CSRF,发音为see-surf)是对Web托管应用程序的攻击,因为恶意网站可能会影响客户端浏览器和浏览器信任网站之间的交互。这种攻击是完全有可能的,因为Web浏览器会自动在每…

汇编语言(二十四)之输出n行星号

输入一个数n,输出n行星号 程序运行: 代码: datas segmentline_number_max_len db 0ffhline_number db 0, 100h dup(?)input_line_number_prompt db input line number:$output db 0dh,0…

家的味道,家的感觉!!!

“大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂。”国庆期间回了一趟家,上次从家里出来还是2020年正月的时候,因为疫情的原因,21年过年没有回去……早早的就买下回家的票,以前回家一趟&…

POJ3889-Fractal Streets【分形,递归,分治】

正题 题目链接:http://poj.org/problem?id3889 大意 第一级城市为图一,然后每次扩展一级就将原本的城市复制3份,一份放上面,一份正旋90’放左上,一份逆序90’放左边,最后将4份的头和尾连起来,…

.NET Core 2将Visual Basic带到了Linux和macOS平台

Microsoft已经愈加接近将Visual Basic划为.NET Core平台上的一等公民。作为.NET Core 2发行版的一部分,VB开发者现在可以编写针对.NET Standard 2.0的控制台应用程序和类库,并且可以兼容多个平台。这就意味着运行在Windows上的可执行文件或者类库也能够运…