2.1 什么是 Orleans 的 Grain

<<返回目录

Grain 是 Orleans 中的重要素素。它是组成 Orleans 应用程序的基本组成部分,具有原子性,事务被封装在 Grain 中,与其它Grain互相隔离,并在分布式网络上进行分发。对开发人员来说,Grain封装了实体的状态和逻辑,并可以通过彼此间的公开方法进行交互。

Orleans 通过下面的特性,简化构建可伸缩的应用,降低开发人员处理并发的门槛:

  • 不要在 Grain 间共享数据,除非通过 Grain 间的消息传递
  • 通过单线程运行每个 Grain 的逻辑来保证 Grain 的高可用性

一个经典的 Grain 将实体的状态和行为封装在 Grain中

Grain 标识

每个 Grain实例具有一个唯一的地址,并通过一个 grain key进行标识,grain key 可以是如下类型:

  • Guid
  • string
  • long
  • long + string
  • Guid + string

调用 Grain

一个 Grain 实现一个或多个 IGrain 接口,要调用一个Grain,开发者需要知道它实现了哪个接口,以及相应的 grain key,如下代码将通过用户的电子邮件获取一个用户配置(IUserProfile)的实例,并调用它的UpdateAddress方法修改此用户的联系地址。

var user = grainFactory.GetGrain<IUserProfile>(userEmail);
await user.UpdateAddress(newAddress);

注意:我们不需要像平时编程一样通过new或者DI去实例化一个Grain,我们调用它的时候,它就已经激活并准备好被我们使用了。这是Orleans的魅力所在:我们永远不需要创建、实例化或删除 Grain,好像所有可能的 Grain (例如有成千上百万的用户配置实例)始终在内存中等待我们调用;这都是因为有 Orleans Runtime 在幕后替我们管理这些繁重的工作。

Grain 的生命周期

Grain 生存在称为 Silo 的容器中。众多的 Silo 组成了 Orleans 集群。当用户请求访问一个Grain时,Orleans 先会检查集群中的 Silo 上是否有一个该 Grain 的实例在运行,如果没有则会进行创建,这个过程称为激活;如果 Grain 使用一持久化特性,那么在激活时会自动从存储中加载状态来初始化这个 Grain。

一旦 Grain 在Silo 中激活,那么它就开始接受调用(外部调用、内部 Grain 间的调用)。在处理请求的过程中,Grain 可能会调用其它的 Grain 或一些外部服务。

如果 Grain 空闲一段时间(可配置)后, Orleans 会从内存中移除Grain 以释放其资源。等到再次请求调用此 Grain 时再次它激活。但不一定在之前的 Silo 上(对开发者来说,不需要关注Grain 在哪一个Silo,即不必关注 Grain的物理位置,开发者永远通过grain key调用它)

Grain 生命周期

Orleans 控制着 Grain 激活、停用的过程,开发人员进行开发时不必理会,只需假设所有的 Grain 均处于激活状态,直接调用。

Grain 生命周期中的关键事件序列如下:

  • 其它 Grain 或客户端调用此 Grain 的方法
  • 激活 Grain(如果它没有在任何一个集群中被激活)
    • 执行 Grain 构造
    • 如果使用了持久化策略,将从存储中加载 Grain 状态
    • 如果有重写OnActivateAsync,将在此时被触发
  • Grain 处理传入的请求
  • Grain 空闲一段时间
  • Silo runtime 决定停止一个 Grain
  • 如果有重写 OnDeactivateAsync Silo runtime 先触发OnDeactivateAsync
  • Silo runtime 从内存移除 Grain

Grain执行

Grain在块中执行,并在执行下一个块之前必须完成当前块的工作(其中包括响应来自其它 Grain 或 Client 的方法调用)。

一个块中执行的基本单位称之为流。

Orleans 可以并行执行多个激活的流,且每个只执行一次。这个机制保障了不需要使用锁或其他同步方法来防止数据竞争或多线程危险。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

  • <<返回目录 可用性 我可以在我的项目中使用Orleans了吗? 当然可以,Orleans使用MIT协议开源,Nu...
    _黑冰_阅读 1,742评论 0 1
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,034评论 1 32
  • <<返回目录 背景 Orleans是微软开源的Actor模型开发框架。 Actor模型此模型解决了并发编程时对资源...
    _黑冰_阅读 3,994评论 0 4
  • 0.Android手机操作系统的四层架构? Applications , Application Framewor...
    lucas777阅读 7,676评论 0 16
  • 小编费力收集:给你想要的面试集合 1.C++或Java中的异常处理机制的简单原理和应用。 当JAVA程序违反了JA...
    八爷君阅读 4,486评论 1 114