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. 一级缓存二级缓存(hibernate)

    缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能.缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事 ...

  2. 使用ReflectionToStringBuilder实现toString方法

    使用ReflectionToStringBuilder实现toString方法 org.apache.commons.lang.builder.ReflectionToStringBuilder是co ...

  3. linux安装oracle笔记

    linux安装oracle .增大swap空间,内存大于8G后swap跟内存同等大小即可 mkdir /home/swap cd /home/swap mkswap swapfile swapon s ...

  4. vue.js实现内部自定义指令和全局自定义指令------directive

    在Vue中,我们平时数据驱动视图时候,内部自带的指令有时候解决不了一些需求,这时候,Vue给我们一个很好用的东东 directive 这个单词是我们写自定义指令的关键字哦 之定义指令为我们提供了几个钩 ...

  5. log 的 debug()、 error()、 info()方法的区别

    软件中总免不了要使用诸如 Log4net, Log4j, Tracer 等东东来写日志,不管用什么,这些东东大多是大同小异的,一般都提供了这样5个日志级别:    × Debug    × Info  ...

  6. Python怎么样入门?Python基础入门教程

    给大家整理的这套python学习路线图,按照此教程一步步的学习来,肯定会对python有更深刻的认识.或许可以喜欢上python这个易学,精简,开源的语言.此套教程,不但有视频教程,还有源码分享,让大 ...

  7. promise异步编程的原理

    一.起源 JavaScript中的异步由来已久,不论是定时函数,事件处理函数还是ajax异步加载都是异步编程的一种形式,我们现在以nodejs中异步读取文件为例来编写一个传统意义的异步函数: var ...

  8. 发博客用的一些HTML

    这个世界,在发生什么? 移动光标 <p style="background: #999999; padding: 5px; font-size: 22px;">< ...

  9. hdu_4717: The Moving Points 【三分】

    题目链接 第一次写三分 三分的基本模板 int SanFen(int l,int r) //找凸点 { ) { //mid为中点,midmid为四等分点 ; ; if( f(mid) > f(m ...

  10. CONSOLE_SCREEN_BUFFER_INFO 结构体

    CONSOLE_SCREEN_BUFFER_INFO结构体 来源:https://msdn.microsoft.com/en-us/library/ms682093(v=vs.85).aspx 作用 ...