初探奥尔良(Orleans)
由于工作上关系目前经常被各种并发数据问题搞得焦头烂额,要么要性能舍弃数据上得一致性,要么要一致性但是却得到了特别糟糕的响应。难道鱼和熊掌真的无法兼得吗?
然后找到了类似奥尔良这种基于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)的更多相关文章
- Microsoft Orleans 之 入门指南
Microsoft Orleans 在.net用简单方法构建高并发.分布式的大型应用程序框架. 原文:http://dotnet.github.io/orleans/ 在线文档:http://dotn ...
- orleans/Documentation
福利 奥尔良的主要好处是︰开发人员工作效率,甚至为非专家程序员;和默认的透明可伸缩性与程序员没有特别努力.我们扩大每个下面这些好处. 开发人员的生产力 奥尔良的编程模型通过提供以下关键的抽象. 担保和 ...
- 微软分布式云计算框架Orleans(1):Hello World
自从写了RabbitHub框架系列后的一段时间内一直在思索更加轻量简便,分布式高并发的框架(RabbitHub学习成本较高),无意间在网上级联看到了很多新框架:从helios到Akka.NET在到Or ...
- Orleans是什么 (一)
官网:http://dotnet.github.io/orleans/ 文档:http://dotnet.github.io/orleans/What's-new-in-Orleans 源码:http ...
- 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之九 || 依赖注入IoC学习 + AOP界面编程初探
更新 1.如果看不懂本文,或者比较困难,先别着急问问题,我单写了一个关于依赖注入的小Demo,可以下载看看,多思考思考注入的原理: https://github.com/anjoy8/BlogArti ...
- Microsoft Orleans构建高并发、分布式的大型应用程序框架
Microsoft Orleans 在.net用简单方法构建高并发.分布式的大型应用程序框架. 原文:http://dotnet.github.io/orleans/ 在线文档:http://dotn ...
- Orleans部署
一.配置指南 1,客户端配置 2,服务端配置 3,典型配置 4,配置.NET垃圾收集 5,SQL系统存储 二.监控 1,运行时监视 2,silo错误代码监测 3,客户端错误代码监测 三.解决部署问题 ...
- Orleans入门
一.Grains 二.开发一个Grain 三.开发一个客户端 四.运行应用程序 五.调式 一.Grains Grains是Orleans编程模型的关键原语. Grains是Orleans应用程序的构建 ...
- Orleans框架------基于Actor模型生成分布式Id
一.Actor简介 actor模型是一种并行计算的数学模型. 响应于收到的消息,演员可以:做出决定,创建更多Actor,发送更多消息,并确定如何响应接收到的下一条消息. 演员可以修改自己的状态,但只能 ...
随机推荐
- lintcode 在O(1)时间复杂度删除链表节点
题目要求 给定一个单链表中的一个等待被删除的节点(非表头或表尾).请在在O(1)时间复杂度删除该链表节点. 样例 Linked list is 1->2->3->4, and giv ...
- 震惊!外部类可以访问内部类private变量
在讲Singleton时我举例时用过这样一段代码: public class SingletonDemo { private static class SingletonHolder{ private ...
- 进阶-MongoDB 知识梳理
MongoDB 一.MongoDB简介 MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种.它在许多场景下可用于替代传统的关系型数据库或键/值存储方式.Mo ...
- 盒子模型、IFC、BFC和Collapsing margins
前言 盒子模型作为CSS基础中的基础,曾一度以为掌握了IE和W3C标准下的块级盒子模型即可,但近日在学习行级盒子模型时发现原来当初是如此幼稚可笑.本文尝试全面叙述块级.行级盒子模型的特性.作为近日学习 ...
- 能否使用require('.json')的方式加载大量JSON文件?
Node.js中推崇非阻塞I/O,但是require一个模块时却是同步调用的,这会带来性能上的开销,但并不是每次require都很耗时,因为在require成功之后会缓存起来,在此加载时直接从缓存读取 ...
- @SpringBootApplication注解理解
@SpringBootApplication包含三个有用的注解,包括 @SpringBootConfiguration:看源码其实就是@Configuration,表示当前类是一个配置类,就像xml配 ...
- java通过反射获取字段的类型
import java.lang.reflect.Field; //这是需要引入的包 Field[] f = 类名.class.getDeclaredFields(); //获取该类的字段for(F ...
- Jmeter性能测试 如何利用SQLserver造出大批的数据
作为一个测试人员,需要做性能测试时候,如果没有实际数据,或者实际数据不适合做压测,就要自己着手造数据了. 以下面的接口测试为例,简单介绍下需要的数据: 这是一个会员注册接口,入参比较多,你可以选用全部 ...
- Flask开发微电影网站(二)
1.安装数据库连接依赖包 pip install flask-sqlalchemy 2.创建movie数据库 在CentOS虚拟机,进入MaridDB数据库提示符,创建movie数据库 create ...
- Go调用C代码,Cgo札记
http://www.myexception.cn/program/679738.html Go调用C代码,Cgo笔记 参考: 官方文档: http://golang.org/cmd/cgo/ htt ...