由于工作上关系目前经常被各种并发数据问题搞得焦头烂额,要么要性能舍弃数据上得一致性,要么要一致性但是却得到了特别糟糕的响应。难道鱼和熊掌真的无法兼得吗?

然后找到了类似奥尔良这种基于Actor模型的kuangjia

首先本人因为是C#系的所以暂不考虑Java系那套,那摆在面前的此类型的框架其实就2个。 Akka.Net和Orleans。

什么是Actor?

Actor应该说是一种编程模型,一个Actor是一个最基本的计算单原,他能接收消息并执行计算(一个行为)

它最重要的特性是每个Actor之间互相隔离,互补共享内存,也就是说每个Actor都能维持一个私有状态且不能被别人所改变。

这对于我们意味着什么呢?想下一般我们遇到的并发问题,是不是在我们执行某个操作的时候,一个数据不正确的被另一个操作所干扰,导致数据最终混乱,而Actor则确保自己的数据不能被别人改变(独立维护自己的状态)以便使得最终一致。

wait

如果Actor自己数据不能被别人改变,那就是顺序执行?那会不会很慢?

对于一个Actor来说,没错,他还真的就顺序执行,因此能确保准确性

但是你真正系统里肯定不会只有一个Actor,而是由很多Actor组成,每个Actor之间是能并行的(因为他们不共享数据,所以他们可以互相独立的正确处理)

具体来说,当并行的消息到达一个Actor的时候,它会存储到一个MailBox(邮箱)里(你可以简单理解为一个队列),然后Actor从MailBox捞数据,一条一条顺序的捞

然后不同的Actor则并行着处理一样的事情

由于大家都是互相独立的处理各自的事情,数据不会发生冲突,也就无需类似锁之类的机制来确保数据一致性问题

由于Actor类文章网上搜索一大片, 在此就不再过多阐述了。

什么是奥尔良?

简单一句话,微软的一个基于Actor模型的实现,具体介绍可以更多参考官网

奥尔良官网

他跟正儿八经的Actor相比,微软习惯就是将其做更加上层的封装,Actor都变成了Grains,万事万物皆是Grains的感觉

我干了什么?

我也刚开始入门,发这篇文章主要是想证实下,Actor那套是不是真的那么神,本文涉及的所有代码均在 https://github.com/virtualcca/OrleansTest/tree/master 上面

既然他们说他们是以单线程来处理同一个Actor,那我就想测试下用Orleans搞一个并发转账的场景,和我常规的多线程并发转账场景的一个对比,而我想看到的结果是,常规版的由于多线程的问题数据总是错乱的,而奥尔良则能始终正确

转账代码

我有一个账户,账户上面有Money, 我能做2个操作,要么转钱过来,要么查看我还有多少钱,当然,转账总要点时间的对吧,所以转账时候Delay了1ms

实际转账的执行代码

可以注意下奥尔良版和原始版唯一区别在于

奥尔良版是通过client.GetGrain来获取了一个IAccount,这样获取到的是属于奥尔良托管的一个Client实例,对其执行的操作其实会发送到Host里执行,然后Host里就是正儿八经的Actor架构来去处理所有操作

但是正如之前介绍Actor的时候谈到单个Actor是单线程,而多个Actor之间是并发,如何确定你是一个还是多个Actor,是通过一个Id来区分(具体奥尔良官网有介绍),而GetGrain后面的那个0的参数就是他的Id,也就是我的这个IAccount是属于一个Actor

常规版直接new一个实例执行同样操作

然后代码运行,可以看到结果

原始版的结果仅供参考,我每次运行得出来的结果也都不一样(多线程执行顺序是不确定的)

而奥尔良版则能正确的恒定输出4950

至此,可以明确奥尔良完美的实现了Actor里关于单个Actor单线程的这么个处理。。。。

初探奥尔良(Orleans)的更多相关文章

  1. Microsoft Orleans 之 入门指南

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

  2. orleans/Documentation

    福利 奥尔良的主要好处是︰开发人员工作效率,甚至为非专家程序员;和默认的透明可伸缩性与程序员没有特别努力.我们扩大每个下面这些好处. 开发人员的生产力 奥尔良的编程模型通过提供以下关键的抽象. 担保和 ...

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

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

  4. Orleans是什么 (一)

    官网:http://dotnet.github.io/orleans/ 文档:http://dotnet.github.io/orleans/What's-new-in-Orleans 源码:http ...

  5. 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之九 || 依赖注入IoC学习 + AOP界面编程初探

    更新 1.如果看不懂本文,或者比较困难,先别着急问问题,我单写了一个关于依赖注入的小Demo,可以下载看看,多思考思考注入的原理: https://github.com/anjoy8/BlogArti ...

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

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

  7. Orleans部署

    一.配置指南 1,客户端配置 2,服务端配置 3,典型配置 4,配置.NET垃圾收集 5,SQL系统存储 二.监控 1,运行时监视 2,silo错误代码监测 3,客户端错误代码监测 三.解决部署问题 ...

  8. Orleans入门

    一.Grains 二.开发一个Grain 三.开发一个客户端 四.运行应用程序 五.调式 一.Grains Grains是Orleans编程模型的关键原语. Grains是Orleans应用程序的构建 ...

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

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

随机推荐

  1. Django REST framework+Vue 打造生鲜超市(十三)

    目录 生鲜超市(一)    生鲜超市(二)    生鲜超市(三) 生鲜超市(四)    生鲜超市(五)    生鲜超市(六) 生鲜超市(七)    生鲜超市(八)    生鲜超市(九) 生鲜超市(十) ...

  2. HTML 返回顶部

    每次看淘宝,看微信,都回有回到顶部的小logo,小图标,或者双击返回顶部.所以就学习了如何返回顶部的操作,一开始是联想html中的链接描点,在开头出设置个标签,下面点击另外一个标志回去.有三种觉得比较 ...

  3. servlet简介及生命周期

    Servlet 简介 Servlet 是什么? Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上 ...

  4. Java CAS 原理分析

    1.简介 CAS 全称是 compare and swap,是一种用于在多线程环境下实现同步功能的机制(可以把 CAS 看做乐观锁).CAS 操作包含三个操作数 -- 内存位置.预期数值和新值.CAS ...

  5. arcEngine开发之加载栅格数据

    加载数据思路 在Engine中加载各种各样的数据都是通过这样的格式 IWorkspaceFactory pWorkspace = new IWorkspaceFactory(); IWorkspace ...

  6. javascript中的隐式类型转化

    javascript中的隐式类型转化 #隐式转换 ## "+" 字符串和数字 如果某个操作数是字符串或者能够通过以下步骤转换为字符串的话,+将进行拼接操作. 如果其中一个操作数是对 ...

  7. String的valueOf()用于将其它类型转换为字符串

    String的valueOf()重载方法可将double类型,int类型,boolean类型以及char数组类型等变量转换为String类变量. 注:String的valueOf()可将char数组转 ...

  8. 关于ConcurrentSkipListMap的理解

    一.前言 JCIP 提到了在 Java 6 中引入了两个新的并发集合类 ConcurrentSkipListMap 和 ConcurrentSkipListSet.其实只要介绍一下 Concurren ...

  9. Linux时间子系统之(十六):clockevent

    专题文档汇总目录 Notes:介绍struct clocke_event_device及其功能feature.模式:触发event接口clockevents_program_event:clockev ...

  10. 你不知道的JavaScript--Item13 理解 prototype, getPrototypeOf 和__proto__

    1.深入理解prototype, getPrototypeOf和_ proto _ prototype,getPropertyOf和 _ proto _ 是三个用来访问prototype的方法.它们的 ...