Orleans有一个降低请求消息序列化开销的功能,这里将首先介绍序列化的工作方式,并解释如何使用这个降低开销的功能

Orleans中的Serialization


当在Orleans中发起一个对grain方法的请求时,Orleans Runtime 对请求的参数进行deep copy,这样是为了保护这些参数传递到目标grain之前被更改。

比如你的某个grain方法参数是一个C# 对象,在你调用grain方法后,在grain方法执行前,你修改了这个C#对象的属性值。deep copy之后,就无需担心这个情况。

如果被调用的grain和发起请求的grain在不同的silo上,那么参数将会被序列化成字节流,传递到备用的grain所在的silo,然后在被序列化为C#对象。如果发起请求的grain和被调用的grain在同一个silo上,复制将直接通过C#的深度拷贝来完成,而不是序列化和反序列化的过程。

请注意,复制、序列化、反序列化这个三个步骤中的C#对象,是具有标识的。也就是说,当你传递一个C#list (其中包含一个C#对象A),然后再次传递一个包含A的list对象到被调用的grain中,被调用对象将得到A对象两次,而不是具有相同值的不同对象(可以当做普通C#中的引用类型来考虑)。

另外也需要注意,Orleans不适用.NET自带的序列化方式或者data contract serializer,它使用一种混合的方式:为普通的系统类型使用手工代码(纯手工映射,序列化和反序列化速度非常高)和Orleans内置的一些类型。这些类型包括C#的基本类型,IPAddress,IPEndPoint,GrainId,ActivationId,SiloAddress,ActivationAddress…这些都Orleans中定义的类型了,然后就是系统的Collections类型。除这些类型之外,序列化将会自动降级到NET的序列化方式。序列化完毕后,进行复制

复制优化


在很多情况下,是不需要deep copy的。比如,orleans client传递一个字节流的请求到grain中,而grain方法中为做任何处理,就把相同的字节流返回,这种情况完毕需要进行任何deep copy.

Immutable

Orleans.Concurrency.Immutable 包装类用户表明一个对象的值是不可变的。因为对象不可变,所以可以安全的共享这些对象,而无需复制。请注意 Immutable  表示对象的提供者和接收者都不会对这个对象进行任何修改,这不是一个单方面的承诺,而是双方的承诺。

使用方式 

Task<byte[]> ProcessRequest(byte[] request);

改变为

Task<Immutable<byte[]>> ProcessRequest(Immutable<byte[]> request);

创建一个不可变对象

Immutable<byte[]> immutable = new Immutable<byte[]>(buffer);
//或者
var immutable= new Object().AsImmutable();

获取不可变对象值的方式

byte[] buffer = immutable.Value;

对不可变对象的进行deep copy

byte[] buffer = immutable.GetCopy();

使用Immutable优化复制的更多相关文章

  1. 使用Immutable优化复制注意事项

    这是Orleans中对于序列化检查类型是否支持Orleans内置的高速序列化时,使用Immutable<>包装和类型声明时,有ImmutableAttribute,效果是一样的.所以无需重 ...

  2. ios优化复制大文件时,如何使内存运用最少且效率最高

    我也是纠结了好几天,我想自己想个办法,但是数据复制不上去,我现在还不明白,如果有人知道我错在哪了,请留言,如果还有更好的方法,请分享共同进步. ____________________________ ...

  3. Orleans 高级特性-目录

    这里将介绍一些Orleans的高级特性,适合对Orleans已经有不少了解的用户,先列出一个索引,博客文章慢慢补充 1.使用Immutable 优化复制 2.自定义序列化 (待完成) 3.可重入 Gr ...

  4. 微软研究院的分布式云计算框架orleans

    orleans   Orleans 客户端请求的消息流转以及消息在Silo中再路由机制 Witte 2015-04-29 21:58 阅读:196 评论:0     一种基于Orleans的分布式Id ...

  5. akka.net与微软分布式框架Orleans

    微软分布式框架Orleans开源了 开源地址: https://github.com/dotnet/orleans 昨天编译了一下,这个最新的Orleans安装程序(用github源码编译的) 下载地 ...

  6. React性能优化总结(转)

    原文链接: https://segmentfault.com/a/1190000007811296?utm_source=tuicool&utm_medium=referral 初学者对Rea ...

  7. 单表60亿记录等大数据场景的MySQL优化和运维之道

    此文是根据杨尚刚在[QCON高可用架构群]中,针对MySQL在单表海量记录等场景下,业界广泛关注的MySQL问题的经验分享整理而成,转发请注明出处. 杨尚刚,美图公司数据库高级DBA,负责美图后端数据 ...

  8. 【转】单表60亿记录等大数据场景的MySQL优化和运维之道 | 高可用架构

    此文是根据杨尚刚在[QCON高可用架构群]中,针对MySQL在单表海量记录等场景下,业界广泛关注的MySQL问题的经验分享整理而成,转发请注明出处. 杨尚刚,美图公司数据库高级DBA,负责美图后端数据 ...

  9. [转载] 单表60亿记录等大数据场景的MySQL优化和运维之道 | 高可用架构

    原文: http://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=209406532&idx=1&sn=2e9b0cc02bdd ...

随机推荐

  1. 41. 这张表lbdeveloplog可以查看各个对象的提交情况,包括是哪个IP提交的

    lbdeveloplog 这张表lbdeveloplog可以查看各个对象的提交情况,包括是哪个IP提交的

  2. (知识分享)软硬件调试九法:第九条规则 如果你不修复一个bug,它将永远 存在

    1.查证问题确已被修复 如果遵循了“制造失败”这条规则,就知道如何验证你确实修复了问题.无论问题和修复看起来多么明显,你都无法保证修复是有效的,直到做了测试并验证. 2.查证确实你的修复措施解决了问题 ...

  3. 使用apache-jMeter出现乱码问题。

    服务器字符(utf-8)正常,但是在使用apache-jMeter的时候,得到的数据会乱码.所以我们需要设置jmeter的字符编码.默认为ISO-8859-1. 进入jmeter.bat文件夹,有个j ...

  4. MFC坐标空间与映射模式

    逻辑坐标:使用GDI绘图时使用的坐标系 设备坐标系:实际设备(显示器.打印机)的坐标系,即我们实际看到的坐标系. 坐标空间 在Windows NT/2000中Win32 API中支持以下四层坐标空间: ...

  5. php json_encode中文unicode问题

    php调用json_encode将中文字符串存入mysql后读取出来有问题,发现存进去的时候把'\'给去掉了.解决方法是调用json_encode时候后面加JSON_UNESCAPED_UNICODE ...

  6. COM符合名字对象建议使用的分隔符

  7. c# & Fizzler to crawl web page in a certain website domain

    使用fizzler [HtmlAgilityPackExtension]和c#进行网页数据提取:fizzler是HtmlAgilityPack的一个扩展,支持jQuery Selector: 提取数据 ...

  8. 比较详细PHP生成静态页面教程

    一,PHP脚本与动态页面. PHP脚本是一种服务器端脚本程序,可通过嵌入等方法与HTML文件混合, 也可以类,函数封装等形式,以模板的方式对用户请求进行处理.无论以何种方式,它的基本原理是这样的.由客 ...

  9. 抽象数据类型ADT

    ADT(Abstract Data Type) 类型由什么组成? 一个类型(type)指定两类信息,一个属性集和一个操作集. 假设要定义一个新的数据类型.首先,要提供存储数据的方式,可能是通过设计一个 ...

  10. HTML标签CSS默认值研究

    最近写css的时候,发现在div元素里面添加ul元素后发现,ul列表在div里面距离最上方总是有一段空行,当时很奇怪,以为是哪个css出了问题,就把css去掉了,发现问题依旧,然后就查了一下发现htm ...