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();

最新文章

  1. 关于B树的一些总结
  2. 百度地图API地理位置和坐标转换
  3. DataSet读取数据
  4. 提升VMware虚拟机性能招数
  5. php xls 导出乱码解决方案
  6. WORD 无格式粘贴 2003 2007 MacOS2011
  7. ZOJ 3829 Known Notation 乱搞
  8. MyBatis_Generator插件的安装以及简单使用
  9. JFreeChart与AJAX+JSON+ECharts两种处理方式生成热词统计可视化图表
  10. 关于CNoTrackObject
  11. 【深度学习笔记】(二)基于MNIST数据集的神经网络实验
  12. 常用的Maven依赖
  13. c语言-自己写的库
  14. Dlib Python 检测人脸特征点 Face Landmark Detection
  15. HPE服务器做raid5阵列
  16. SimpleCaptcha生成图片验证码内容为乱码
  17. 优雅的vue.js
  18. 系统管理命令之who
  19. word 杂记
  20. Oracle常用名词解释

热门文章

  1. SQL笔记-第六章,索引与约束
  2. HTTP的GET/POST细节
  3. 内置对象(Session、Application、ViewState)
  4. .net中自定义过滤器对Response内容进行处理
  5. json 特殊字符 javascript 特殊字符处理(转载)
  6. java异常和spring事务注解
  7. (四) 一起学 Unix 环境高级编程(APUE) 之 系统数据文件和信息
  8. css加阴影
  9. python之获取页面标签的方法
  10. ZERO 笔试