使用Immutable优化复制
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优化复制的更多相关文章
- 使用Immutable优化复制注意事项
这是Orleans中对于序列化检查类型是否支持Orleans内置的高速序列化时,使用Immutable<>包装和类型声明时,有ImmutableAttribute,效果是一样的.所以无需重 ...
- ios优化复制大文件时,如何使内存运用最少且效率最高
我也是纠结了好几天,我想自己想个办法,但是数据复制不上去,我现在还不明白,如果有人知道我错在哪了,请留言,如果还有更好的方法,请分享共同进步. ____________________________ ...
- Orleans 高级特性-目录
这里将介绍一些Orleans的高级特性,适合对Orleans已经有不少了解的用户,先列出一个索引,博客文章慢慢补充 1.使用Immutable 优化复制 2.自定义序列化 (待完成) 3.可重入 Gr ...
- 微软研究院的分布式云计算框架orleans
orleans Orleans 客户端请求的消息流转以及消息在Silo中再路由机制 Witte 2015-04-29 21:58 阅读:196 评论:0 一种基于Orleans的分布式Id ...
- akka.net与微软分布式框架Orleans
微软分布式框架Orleans开源了 开源地址: https://github.com/dotnet/orleans 昨天编译了一下,这个最新的Orleans安装程序(用github源码编译的) 下载地 ...
- React性能优化总结(转)
原文链接: https://segmentfault.com/a/1190000007811296?utm_source=tuicool&utm_medium=referral 初学者对Rea ...
- 单表60亿记录等大数据场景的MySQL优化和运维之道
此文是根据杨尚刚在[QCON高可用架构群]中,针对MySQL在单表海量记录等场景下,业界广泛关注的MySQL问题的经验分享整理而成,转发请注明出处. 杨尚刚,美图公司数据库高级DBA,负责美图后端数据 ...
- 【转】单表60亿记录等大数据场景的MySQL优化和运维之道 | 高可用架构
此文是根据杨尚刚在[QCON高可用架构群]中,针对MySQL在单表海量记录等场景下,业界广泛关注的MySQL问题的经验分享整理而成,转发请注明出处. 杨尚刚,美图公司数据库高级DBA,负责美图后端数据 ...
- [转载] 单表60亿记录等大数据场景的MySQL优化和运维之道 | 高可用架构
原文: http://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=209406532&idx=1&sn=2e9b0cc02bdd ...
随机推荐
- Hadoop HDFS编程 API入门系列之合并小文件到HDFS(三)
不多说,直接上代码. 代码 package zhouls.bigdata.myWholeHadoop.HDFS.hdfs7; import java.io.IOException;import ja ...
- BASE64 官方方法,我自己用的,注意记住换行问题。
TBase64Encoding.Base64.Encode(str) TBase64Encoding.Base64.Decode(str) 注意如果str很长,base64后的结果是每76个字符自动加 ...
- 关于生物信息学与R的相关资料和网站
生物信息学的相关论坛:http://www.omicshare.com/forum/ 糗世界:http://qiubio.com:8080/ 统计之都网站 绘制QQ图和曼哈顿图:http://www. ...
- java线程的理解
java thread类都是native方法实现的,所以没有用平台无关的方法实现,怎么实现的呢? 线程的实现: 第一种:使用内核线程实现. 内核线程就是直接使用操作系统内核支持的线程,由内核完成切换. ...
- 【PowerOJ1740&网络流24题 圆桌聚餐】(最大流)
题意: 来自n个不同国家的代表开会,每个国家代表数为ci 会场有m张圆桌,每张桌子可容纳mi人 不希望有同一个国家的代表在同一张桌子上就餐 设计一个合法方案 (n,m<=300) 思路:最大流, ...
- webView.loadUrl 错误:A WebView method was called on thread 'JavaBridge'.
String voicePath="file://"+MVOICEPATH; webView.loadUrl("javascript:voiceStopCallback( ...
- HTML中doctype以及target论述
首先,为什么要在每个html文档开头写入<!doctype......>呢. ...
- DB2不记录事务日志
1. DB2大数据处理不记录事务日志步骤: 建表需要添加属性“NOT LOGGED INITIALLY” 在大批量更改操作的同一个事务开始时执行:“ALTER TABLE tabname ACTI ...
- 揭开HTTP网络协议神秘面纱系列(三)
HTTP首部字段有四种类型:通用首部字段,请求首部字段,响应首部字段,实体首部字段. 通用首部字段: 首部字段 说明 Cache-Control 控制缓存的行为 Connection 逐跳首部.连接的 ...
- python安装pycrypto报错error: command 'x86_64-linux-gnu-gcc' failed with exit status 1
系统3.19.0-15-generic #15-Ubuntu 安装pycrypto提示error: command 'x86_64-linux-gnu-gcc' failed with exit st ...