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. HttpURLConnection下载图片的两种方式

    public class MainActivity extends AppCompatActivity { private ImageView iv; private String imageurl ...

  2. Explode TArray

    function Explode(const Separator, S: string; Limit: Integer = 0): TArray;var SepLen : Integer; F, P ...

  3. JStrom的zk数据

    /jstorm/masterlock 用于LeaderSelector的锁. /jstorm/master get /jstorm/master localhost.localdomain:7627 ...

  4. xfire webServeic 例子

    xfire webServeic 例子,参考网上众多例子,自己写得完成了,给大家分享 大家只要按这个目录去建文件就可以了,然后运行,至于其中原理慢慢理会吧 环境:myeclipse 10 +xfire ...

  5. jstl格式化数字

    jstl中的<fmt:formatNumber>标签   设置显示时间戳<%    request.setAttribute("currentTimeStamp" ...

  6. 基于bootstrap分页

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. how spring resolves a request

    quoted from answer at http://stackoverflow.com/questions/14015642/how-does-the-dispatcherservlet-res ...

  8. AndroidStudio调试APP

    AndroidStudio调试APP 电脑用数据线连上手机 开启手机的开发者模式 注:通常连续狂点手机的版本号即可显示出开发者选项,然后进入菜单,勾选开发者选项.USB调试. 给程序加断点 单击调试按 ...

  9. Git版本控制教程

    Git 版本控制入门 不了解Git请查看权威Git书籍 ProGit(中文版). 一份很好的 Git 入门教程,点击这里查看. Git客户端下载地址: 官方Git - TortoiseGit - So ...

  10. 交换机和VLAN

    交换机 交换机的两个作用:一是维护CAM表,CAM表是计算机的MAC地址和交换机端口的映射表:另一个是根据CAM来进行数据的转发. 以太网交换机转发数据帧有三种方式: 1.存储转发:即先存储后转发的方 ...