Orleans简介.

  Orleans是微软开源的分布式actor模型框架.actor模型的原理网络上有很多文章.有许多理论性的文章,深刻地我都不知道怎么应用.在这里我就不赘述了.既然是博客,就说说自己的理解。

对于编程来说,不管是前台还是后台,在现在的计算机环境下,多线程编程是不可避免的。多线程带来的很多好处,也带来的很多编程上的“坏处”。好处就是,什么并发、高效,高资源利用率等等高大上的词语。这些就不详细说了。就说说坏处.

多线程带来的最大的变化就是:我先前保存的变量A,在我想要再次利用它的时候,A是否被其他线程给更改了?数据库中叫脏读,我们拿过来用,“避免脏读”又有个同义词叫做“操作的原子性”。为了解决脏读的问题,有一下几种办法:

  1. 办法一变量A在初始赋值的时候,就规定它不可以被更改,就是不可变,英文叫做immutable,很多函数式语言如F#,scala等都有不可变量。既然量是不可变的。就不会有什么脏读问题了。这真是个好办法,但是在C#和JAVA这样的语言里,这不是个好办法。
  2. 办法二就是大家经常使用的,多线程,架锁。精巧的设计类,小心的使用这些来,管理各种资源的竞争。为了避免脏读,在C#以及JAVA里,架锁是一个可行的办法。但是这样会使得效率变低(锁架地多了,这个会更明显),更为关键是带来逻辑的复杂性。架锁的程序,可以说是一个“正确但是脆弱”的程序。离开了初创人员,后来的人想读懂读透?呵呵,人生苦短。
  3. 办法三,也是Orleans采用的办法,设计一个类,保证这个类从“创建”过程到“销毁”过程,以及“中途调用它的方法”的执行过程,这三个“过程”不管何时何地调用,都会在同一个线程中运行。这样的化,我就可以放心大胆的去修改,调用这个类的方法,而不用担心这个指向这个类的变量出现“脏读”的情况。这个某种程度上算是办法一和二的折中。为了说明这个办法,就不得不说Actor模型。

  人与人的沟通只是通过消息,不管是听闻嗅触等等感觉,都是往外界往人的身体发送的消息.人处理后做出反应.这个处理与反应是异步的.接受消息和处理消息都是并行的、同时的进行。actor模型就是模拟这种通信方式.用Actor作为名称,也算是指明了这个模型想要模拟什么。

  既然是模拟,那就是简单化。Orleans模型里,每一个actor有专门的类代表它,叫做Grain,这个grain类就是模拟通信场景中的”人”,但是Orleans为了解决多线程带来的“资源竞争”等问题,采用了办法三,再Orleans框架内,它保证每个grain类符合以下行为规范:

  A. 发往同一个grain类实例的任何消息都会在固定线程内执行。

  B. grain类按照接受消息的先后,依次处理消息。在任意时间点,一个grain实例只处理一个消息。

  C. grain实例内的字段属性,只能由实例本身访问。外界不能访问。

  在大部分情况下,这些规范都是成立的。这些规范被称为“单线程机制”。但是也要有“变通”,这些“变通”涉及到很多其他方面,在以后的文章中会解释是如何变通的,为什么要变通,以及什么场景下才需要变通。不过现在你可以认为,这些规则就是“法律”。在Orleans的框架内,这些grain们都是一些“头脑简单并且自闭的人”。你作为设计者,如果恰到好处的布置这些“人”,它们会给你惊喜。比如对于消息的处理,可以做到全程无锁等。。。高大上的特性。

  同时Orleans是使用Actor模型的,同时微软更近了一步,它是使用的虚拟的Actor模型。具体怎么个虚拟法,这个以后的文章中解释。

  以上说了那么多,就说明Orleans是使用actor模型的。还没有说分布。Orleans是分布式的。那是因为所有Actor之间的互动是跨线程的,甚至是跨计算机的。同时Orleans框架保证开启多个服务端程序实例,通过简单的配置,它们的行为就会如同单一的服务端实例一样。客户端感觉不到区别,简单的说就是服务端能“合体”。两个小奥特曼,每个小奥特曼由更小的细胞组成,同时他们又合体变成了一个大的奥特曼,就问你怕不怕,你如果不怕,Orleans甚至实现了“合体的合体”---这种横向扩展性为高可用,资源的充分利用以及大吞吐量带来可很大的想象空间,同时也是灵活部署的基础。另外利用Orleans的Actor模型,也可以很容的实现event sourcing。它甚至已经内置了event sourcing中间件。

  Orleans同时也有Net.Core版本,利用它可以实现跨平台运行,它名字叫做Orleans vNext.我是按照framwork版本写的。两个版本的使用方法几乎相同。

  这个世界有很多actor模型框架,JAVA和Scala的AKKA,C#的AKKA.Net以及Orleans。它们都是开源的,都可以去下载它们的源码学习。在写文章的时候,Orleans版本刚刚是1.5版本,所以我就只能按照1.5版本来写。

  要读的非常的顺畅,我假定读者都熟悉C#,熟悉多线程,特别是C#中Task类的用法,虽然很多时候,这些没有这些知识也能非常顺利的读懂,但是有,会在关键的时刻帮助你理解Orleans。更进一步,如果熟悉了以上知识,才能明白Orleans能不能帮助你解决实际工作中的问题。以及在技术选型的时候,明白Orleans是不是你想要的。

  为了更为深入的展开,先举个栗子。

Orleans简介的更多相关文章

  1. Microsoft Orleans 之简介

    Microsoft Orleans 在.net用简单方法构建高并发.分布式的大型应用程序框架. 原文:http://dotnet.github.io/orleans/ 在线文档:http://dotn ...

  2. Microsoft Orleans 之 入门指南

    Microsoft Orleans 在.net用简单方法构建高并发.分布式的大型应用程序框架. 原文:http://dotnet.github.io/orleans/ 在线文档:http://dotn ...

  3. Microsoft Orleans构建高并发、分布式的大型应用程序框架

    Microsoft Orleans 在.net用简单方法构建高并发.分布式的大型应用程序框架. 原文:http://dotnet.github.io/orleans/ 在线文档:http://dotn ...

  4. Orleans 知多少 | Orleans 中文文档上线

    Orleans 简介 Orleans是一个跨平台框架,用于构建健壮,可扩展的分布式应用程序 Orleans建立在.NET开发人员生产力的基础上,并将其带入了分布式应用程序的世界,例如云服务. Orle ...

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

    自从写了RabbitHub框架系列后的一段时间内一直在思索更加轻量简便,分布式高并发的框架(RabbitHub学习成本较高),无意间在网上级联看到了很多新框架:从helios到Akka.NET在到Or ...

  6. Orleans框架------基于Actor模型生成分布式Id

    一.Actor简介 actor模型是一种并行计算的数学模型. 响应于收到的消息,演员可以:做出决定,创建更多Actor,发送更多消息,并确定如何响应接收到的下一条消息. 演员可以修改自己的状态,但只能 ...

  7. Orleans 知多少 | 2. 核心概念一览

    Orleans 术语解读 上面这张图中包含了Orleans中的几个核心概念: Grain Silo Orleans Cluster Orleans Client 从这张图,我们应该能理清他们之间的关系 ...

  8. Orleans 初接触

    简介 这篇随笔主要记录了自己学习Orleans的经过和理解,在学习过程中会一直更新,思路和理解可能有些偏颇,如果有幸有大佬看到这篇文章,希望能给予批评指正. 导航 (一) 入门例子 (二) 测试用例 ...

  9. Orleans[NET Core 3.1] 学习笔记(四)( 3 )监控Orleans Silo的方式 OrleansDashboard

    简介 Orleans用起来的确很爽,更爽的是咱们有能监控它的工具. OrleansDashboard 这个工具是一个可视化的Silo监控工具,Silo和Grain的活跃状态一目了然,各个接口的响应速度 ...

随机推荐

  1. Object-C知识点 (一) 常用知识点

    Object-C常用的知识点,以下为我在实际开发中用到的知识点,但是又想不起来,需要百度一下的知识点 #pragma mark -- isKindOfClass与isMemberOfClass isK ...

  2. OpenCV探索之路(十八):使用imwrite调整保存的图片质量

    近日在用opencv做一些图像处理的操作时,需要对一些高分辨率的图像进行保存.比如,在操作一个容量为230M的图像后,并对该图像保存为JPG格式后,发现图像容量变为80M了!针对这个问题,忙了大半天, ...

  3. MinGW(GCC)编译DLL文件

    这两天用CB(Code::Blocks)写个小程序,要编译出DLL供VB(6)使用.CB使用mingw-gcc作为编译器,在库文件的产出上跟VC.VS之类的IDE略有不同. 由于C语言的基础知识不是太 ...

  4. Tomcat7安装(linux环境)

    1.获取安装包 如果没有tomcat,则创建之,并下载二进制文件到该目录,如下: mkdir /opt/tomcat cd /opt/tomcat wget http://mirrors.hust.e ...

  5. Spring3 MVC 类型转换

    1. Spring在进行类型转化都是基于java.beans.PropertyEditor接口. 2. 可以使用@InitBinder来进行对单个controller的类型进行操作,比如添加Date类 ...

  6. Java版简易画图板的实现

    Windows的画图板相信很多人都用过,这次我们就来讲讲Java版本的简易画板的实现. 基本的思路是这样的:画板实现大致分三部分:一是画板界面的实现,二是画板的监听以及画图的实现,三是画板的重绘.(文 ...

  7. UDP和多线程服务器

    UDP: UDP是数据报文传输协议,这个传输协议比较野蛮,发送端不需要理会接收端是否存在,直接就发送数据,不会像TCP协议一样建立连接.如果接收端不存在的话,发送的数据就会丢失,UDP协议不会去理会数 ...

  8. 迭代器 Iterator

    迭代器 Iterator 2016-5-7 可以这样说,迭代器统一了对容器的访问方式. 考虑这样的情景:原本是对着List编码,但是后来发现需要把相同的代码用于Set.我们需要一种不关心容器类型 而能 ...

  9. Windows查看端口使用状况

    使用端口是我们在进行远程或者打印机等都会遇到的,但是有很多用户会遇到端口被占用的情况,遇到这样的问题首先就要找出电脑中的所以端口然后进行查看,还是有很多人不知道该如何查看电脑端口. 1 查看windo ...

  10. python开发部署时新增数据库中表的方法

    在项目版本让运维部署时,涉及到数据库表的增加问题,想了一下,可以有四种方法 1.使用SQLAlchemy的db.create_all()方法 # -*- coding:utf-8 -*- from f ...