本人也是英文盲,翻译不对的地方请谅解。由于翻译内容较多,会慢慢更新

orleans简称ol,一些专用词不做翻译。先决条件,读这表文章之前需要了解:actor,es,cqrs

参考链接:

https://www.cnblogs.com/netfocus/p/4150084.html

http://www.infoq.com/cn/articles/microservices-aggregates-events-cqrs-part-1-richardson

https://studygolang.com/articles/6250

一.基础开始:

1.使用ol的必要条件:ol是一个来自NuGet的类库。你需要 .NET Core 2.0以上和.NET Framework 4.6.1以上版本才能使用它。在.net core 下ol可以在windows,Linux,MacOS下运行。

目前ol是在windows上测试的,但是许多用户在非Windows平台上也成功运行了ol。

开发工具,建议使用Visual Studio 2017或更高版本。

在生产环境中,为了维护可靠的集群成员关系,ol需要持久化存储。你可以选择以下其中一种

Azure Table Storage 8.2.1或以上版本
SQL Server 2008或以上版本
ZooKeeper 3.4.0或以上版本
MySQL 5.0或以上版本
PostgreSQL 9.5或以上版本
Consul 0.7.0或以上版本
DynamoDB

还有一种办法是使用Azure的service fabric

2.Grains

grains是ol编程模型的关键,grains构成了ol应用,它是隔离的,持久的,分布的。grain就好比.net中的实体对象。grain之间可以通过接口相互调用。

ol的目标是大大简化构建可伸缩应用程序的难度,并避免了大多数并发性问题,grain之间不共享事例,只能通过消息传递。每个grain保证单线程运行

一个典型grain有状态和行为(例如特定的用户或方法或会话)

每一个grain都有一个唯一标识,也称为grain主键。主键可以试long,string ,guid。

如何访问一个grain

一个grain类实现一个或多个grain接口,要调用一个grain,调用者需要知道grain类实现的接口,该接口包括调用者想要调用的方法和目标grain的唯一标识。

例如,如果使用电子邮件作为唯一标识,则可以调用用户配置grain来更新用户地址。

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

GetGrain的调用是一种廉价的本地操作,用于构建对目标grain的引用。注意,不需要创建或实例化目标grain,我们调用usergrain来更新地址,就好像usergrain已经实例化了。

这是ol编程模型的最大优势之一我们从来不需要创建、实例化或删除grain。可能有数百万的grain在内存中等待我们调用它,在内部ol能通过一系列复杂的操作来把grain加载到内存中。

grain的生命周期

grain在执行容器里,叫做silo。silo形成一个集群,将多个物理或虚拟机的资源组合在一起,当有对grain请求时,ol确保在集群中的一个silo上有该谷物的实例。如果任何silo上没有grain实例,ol内存管理将创建一个。这个过程叫做激活。

如果grain使用了持久化,在激活时自动从存储器读取状态。一旦在silo上激活,grain处理来自其他grain或来自前端web服务器的传入请求。在处理请求的过程中,grain可以调用其他grain。

如果一个grain停止接收请求并保持空闲,在一段不活动时间后,ol将grain从内存中删除(使其失效),以释放资源用于其他grain。如果并且当有一个新的grain请求时,ol会再次激活它,可能是在一个不同的silo上激活,

所以调用者会有这样的感觉,grain会一直留在内存中。grain经历了生命周期,从仅作为其存储中的持久化状态(如果有的话)存在,到在内存中实例化,到从内存中删除。

ol能隐式控制grain的激活和停用过程,应此在编写一个grain时,开发人员假设所有gain都被激活。

grain生命周期中的关键事件顺序是这样的:

一个grain或一个客户端调用另一个grain的方法

grain被激活(如果它还没有在集群中的某个地方被激活的话),grain类的一个实例被创建,称为grain激活

grain的构造函数使用依赖注入(如果适用)来执行,如果声明了持久性,则从存储中读取grain的状态

如果重写,则调用OnActivateAsync(此方法在grain激活时会被调用)

grain处理传入的请求

grain闲置了一段时间

silo内存管理决定停用grain

如果重写OnDeactivateAsync,则调用OnDeactivateAsync(此方法在grain停用时会被调用)
silo内存管理从内存中删除谷物

当一个silo被正确的关闭时,它所拥有的所有grain激活都被停用。在grain队列中等待处理的任何请求都被转发到集群中的其他silo中,在那里,根据需要创建并激活新的停用grain。

请注意,检测silo的故障需要一些时间(这是可配置的),因此重新激活停用的grain的过程不是立即进行的。

 

orleans 2.0 教程之-----官方文档翻译,给大家学习ol一个参考的更多相关文章

  1. Django 2.0.1 官方文档翻译: 编写你的第一个 Django app,第一部分(Page 6)

    编写你的第一个 Django app,第一部分(Page 6)转载请注明链接地址 Django 2.0.1 官方文档翻译: Django 2.0.1.dev20171223092829 documen ...

  2. Django 2.0.1 官方文档翻译: 编写你的第一个 Django app,第四部分(Page 9)

    编写你的第一个 Django app,第四部分(Page 9)转载请注明链接地址 该教程上接前面的第三部分.我们会继续开发 web-poll 应用,并专注于简单的表单处理和简化代码. 写一个简单的表单 ...

  3. Django 2.0.1 官方文档翻译:编写你的第一个djang补丁(page 15)

    编写你的第一个djang补丁(page 15) 介绍 有兴趣为社区做一些贡献?可能你发现了django中的一个你想修复的bug,或者你你想添加一个小小的功能. 回馈django就是解决你遇到的问题的最 ...

  4. Django 2.0.1 官方文档翻译: 编写你的第一个 Django app,第五部分(Page 10)

    编写你的第一个 Django app,第五部分(Page 10)转载请注明链接地址 我们继续建设我们的 Web-poll 应用,本节我们会为它创建一些自动测试. 介绍自动测试 什么是自动测试 测试是简 ...

  5. Django 2.0.1 官方文档翻译: 编写你的第一个 Django app,第二部分(Page 7)

    编写你的第一个 Django app,第二部分(Page 7)转载请注明链接地址 本教程上接前面的教程.我们会配置数据,创建你的第一个 model,并对Django 自动生成的 admin 站点进行快 ...

  6. Django 2.0.1 官方文档翻译: 编写你的第一个 Django app,第七部分(Page 12)

    编写你的第一个 Django app,第七部分(Page 12)转载请注明链接地址 本节教程承接第六部分(page 11)的教程.我们继续开发 web-poll应用,并专注于自定义django的自动生 ...

  7. Django 2.0.1 官方文档翻译:编写你的第一个 Django app,第六部分(Page 11)

    编写你的第一个 Django app,第六部分(Page 11)转载请注明链接地址 本教程上接前面第五部分的教程.我们构建了一个经过测试的 web-poll应用,现在我们会添加一个样式表和一张图片. ...

  8. Django 2.0.1 官方文档翻译: 编写你的第一个 Django app,第三部分(Page 8)

    编写你的第一个 Django app,第三部分(Page 8)转载请注明链接地址 本页教程接前面的第二部分.我们继续开发 web-poll app,我们会专注于创建公共接口上 -- "视图& ...

  9. Django 2.0.1 官方文档翻译: 高级教程:如何编写可重用的app (page 13)

    高级教程:如何编写可重用的app (page 13) 本节教程上接第七部分(Page 12).我们会把我们的 web-poll应用转换成一个独立的python包,你可以在新的项目中重用或者把它分享给其 ...

随机推荐

  1. 【转】JMeter 聚合报告之90% Line参数说明

    其实要说明这个参数的含义非常简单,可能你早就知道他的含义,但我对这个参数一直有误解,而且还一直以为是“真理”,原于一次面试,被问到了这个问题,所以引起我这个参数的重新认识. 先说说我错误的认识: 我一 ...

  2. PHP面向对象深入研究之【组合模式与装饰模式】

    组合模式 定义:组合模式定义了一个单根继承体系,使具有截然不同职责的集合可以并肩工作. 一个军队的案例, <?php abstract class Unit { // 个体 abstract f ...

  3. TCP与UDP比较 以及并发编程基础知识

    一.tcp比udp真正可靠地原因 1.为什么tcp比udp传输可靠地原因: 我们知道在传输数据的时候,数据是先存在操作系统的缓存中,然后发送给客户端,在客户端也是要经过客户端的操作系统的,因为这个过程 ...

  4. cpu,io密集型计算概念

    I/O密集型 (CPU-bound) I/O bound 指的是系统的CPU效能相对硬盘/内存的效能要好很多,此时,系统运作,大部分的状况是 CPU 在等 I/O (硬盘/内存) 的读/写,此时 CP ...

  5. python使用multiprocessing进行多进程编程(1)

    multiprocessing模块实现了对多进程编程的封装,让我们可以非常方便的使用多进程进行编程.它的使用方法非常类似threading模块. 1.创建一个进程 import multiproces ...

  6. 【问题】/usr/bin/env: php: 没有那个文件或目录

    php不是默认安装的,在使用symfony创建新项目时,出现这个提示. [root@localhost html]# symfony demo /usr/bin/env: php: 没有那个文件或目录 ...

  7. fgets、gets和scanf的区别

    gets()从stdin流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中.换行符不作为读取串的内容,读取的换行符被转换为null值,并由此来结束字 ...

  8. as+bt=1是ab两数互质的充要条件

    [as+bt=1是ab两数互质的充要条件] 充分性,as+bt=1 => (a,b)=1: 因为as+bt=1,设c=(a,b),则c整除a和b,所以c整除as+bt,即c整除1,所以c=1,即 ...

  9. leetcode:Median of Two Sorted Arrays分析和实现

    这个问题的大意是提供两个有序的整数数组A与B,A与B并集的中间数.[1,3]与[2]的中间数为2,因为2能将A与B交集均分.而[1,3]与[2,4]的中间数为2.5,取2与3的平均值.故偶数数目的中间 ...

  10. 解决nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)

    nginx先监听了ipv4的80端口之后又监听了ipv6的80端口,于是就重复占用了.更加坑人的是你去看了端口占用它又把80端口释放了,是不是很囧. 解决方案是编辑nginx的配置文件 修改这一段: