Microsoft 发布了他们自己对 Apache Avro 通信协议的实现。Avro 被描述为“紧凑的二进制数据序列化格式,类似于 Thrift 或者 Protocol Buffers”,同时还有像 Hadoop 这样的分布式处理环境所需要的额外功能。
为了让该协议尽可能地快, Microsoft Avro 类库会在运行时使用表达式树构建并编译一个自定义的序列化器。在第一次命中将序列化器编译成 IL 代码之后,它的性能要比基于反射的算法更好。
和 Protocol Buffers 不同的是,Avro 协议是自描述的。当客户端和服务器之间建立连接的时候,模式就会被传送。通常情况下模式仅会被传输一次,因此没必要硬编码二进制格式,也没有在每个消息里面传递模式的代价。
由于以上种种原因,Microsoft Avro 类库能支持下面三种模式:
- 反射模式。基于.NET 类型的模式构建序列化器的 IL 代码以便于实现性能最大化。
- 通用记录模式。可以在运行时指定数据的 JSON 模式,因此能够处理任意模式的动态数据。
- 容器模式。类库能够生成嵌入了模式的可移植文件。文件格式与 Avro 容器文件规范兼容,同时能够跨平台使用。
在反射模式下使用的时候,Avro 使用 WCF 开发者所熟悉的 DataContract/DataMemeber 属性。
通用记录模式会假定你并没有一个预定义的.NET 类用来存储数据。相反地,你使用 AvroRecord 类连同一个描述数据格式的 JSON 文档。AvroRecord 对象需要使用后期绑定模式访问(C# dynamic、关闭 VB Option Strict)。
容器模式可以连同反射模式或者通用记录模式一起使用。因为你是以这种模式创建文件而不是通过可以对数据进行压缩和 / 或加密(使用你喜欢的任意方式)的线路发送消息。开箱即用并不会让你感受到压力或者抑制,但是它仅包含构建代码解码器的指令。
查看英文原文: Introducing Microsoft Avro
评论