使用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 ...
随机推荐
- HttpURLConnection下载图片的两种方式
public class MainActivity extends AppCompatActivity { private ImageView iv; private String imageurl ...
- Explode TArray
function Explode(const Separator, S: string; Limit: Integer = 0): TArray;var SepLen : Integer; F, P ...
- JStrom的zk数据
/jstorm/masterlock 用于LeaderSelector的锁. /jstorm/master get /jstorm/master localhost.localdomain:7627 ...
- xfire webServeic 例子
xfire webServeic 例子,参考网上众多例子,自己写得完成了,给大家分享 大家只要按这个目录去建文件就可以了,然后运行,至于其中原理慢慢理会吧 环境:myeclipse 10 +xfire ...
- jstl格式化数字
jstl中的<fmt:formatNumber>标签 设置显示时间戳<% request.setAttribute("currentTimeStamp" ...
- 基于bootstrap分页
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- how spring resolves a request
quoted from answer at http://stackoverflow.com/questions/14015642/how-does-the-dispatcherservlet-res ...
- AndroidStudio调试APP
AndroidStudio调试APP 电脑用数据线连上手机 开启手机的开发者模式 注:通常连续狂点手机的版本号即可显示出开发者选项,然后进入菜单,勾选开发者选项.USB调试. 给程序加断点 单击调试按 ...
- Git版本控制教程
Git 版本控制入门 不了解Git请查看权威Git书籍 ProGit(中文版). 一份很好的 Git 入门教程,点击这里查看. Git客户端下载地址: 官方Git - TortoiseGit - So ...
- 交换机和VLAN
交换机 交换机的两个作用:一是维护CAM表,CAM表是计算机的MAC地址和交换机端口的映射表:另一个是根据CAM来进行数据的转发. 以太网交换机转发数据帧有三种方式: 1.存储转发:即先存储后转发的方 ...