Thrift之TProtocol类体系原理及源码详细解析之稠密协议类TDenseProtocol

密集协议解析
本文解析了密集协议的工作原理及其优缺点,介绍了如何使用Thrift实现数据的高效编码与解码,并探讨了密集协议在实际应用中的局限性。

我的新浪微博:http://weibo.com/freshairbrucewoo

欢迎大家相互交流,共同提高技术。

这个协议类不建议投入到实际的生产环境(除非自己做了很强的压力和全面的测试)。这个密集协议的最大作用就是尽可能使用小的空间,密集协议类有两种类型的实例对象,一种是独立的,它不被使用在rpc通信中,而只是用于编码和解码;另一种是非独立的实例类型,它可以用于rpc通信,不过现在还不支持这种类型的实例。

要使用这个密集协议类来进行编码和解码必须支持Thrift自己实现的一直特殊的记录数据类型形式:就是type_spec属性,它的主要作用就是用于本地化反射机制来进行读写数据。

最佳的实践方法如下:

(1)永远不要使用可选的原语或容器类型;

(2)如果数据类型非常的大或非常的稀少那么使用结构体类型(struct);

(3)所有整数类型使用可变长的,能够使用i64类型避免膨胀;

(4)永远不要以任何方式修改结构体的定义而不改变换成的键,否则会造成恐慌的错误。

这个密集协议类继承至二进制协议类,所以可以直接使用二进制协议类的一些协议方法。

那么这个协议类相比前面的协议类又有什么优势和不足。既然这个协议类是后面逐渐发展起来的,那么它肯定有自己的优势和适合的应用场景,据我学习之,它的优势如下:

(1)相比较二进制协议它使用了可变长编码,当然紧凑协议类也实现了这个来减少整数型数据的传输流量,那么它相对于紧凑协议类又有什么优势?请看下面一条;

(2)相对于紧凑协议类它减少了一部分元数据的传输,例如struct结构里面的字段id和数据类型,这样就极大的减少了流量,当然速度也就自然提升了不少。

虽然它有这些优势,但是它的缺陷也是比较明显的,主要有以下三点:

(1)抽象将失去效果;

(2)必须维持第二个代码生成器;

(3)想要保持与旧版本的兼容将是是非常困难的。

通过它的优势和缺陷的分析发现,它们都是那么的鲜明,所以选择这个协议作为传输层之上的协议类型需要经过比较慎重的考虑,优点其实就是靠牺牲抽象性、易维护和向前兼容来提升数据传输速度和减少流量。

那么实现这个协议类需要用到什么特殊的技术,通过代码和注释发现,主要两点技术,一个是可变长编码,这个在紧凑协议类中已经实现和介绍;另一个技术就是消除一些传输的元数据。消除元数据的传输需要支持Thrift的编译器和牺牲一些二进制协议的向前和向后的兼容性。

上面分析了密集协议类的优秀和不足,但是就目前而言这个类还是处于试验的阶段,不能投入真正的生产环境,所以就不具体分析代码的实现了,有兴趣的同仁们可以自己看看代码的实现,使用到的技术前面已经介绍了。


简介: thrift是跨语言,serverclient通信的一个框架,支持多种协议,二进制,文本http,json等方式,提供高效的数据传输方式。 thrift只负责对数据进行处理,然后在网络内进行传输的工作。不要认为thrift能在*.thrift文件中定义调度之的工作 thrift通过IDL(接口描述语言)来生成各种语言需要的接口代码。 执行thrift文件命令: java:thrift-0.9.1.exe --gen java test.thrift java:thrift-0.9.1.exe --gen php test.thrift 生成使用thrift需要的jar包: 下载Ant后, 配置环境变量, ANT_HOME=Ant解压路径。 下载thrift后使用ant编译需要的jar文件。<< cmd, 进入build.xml目录, ant -buildfile build.xml thrift协议protocol: TBinaryProtocol:二进制格式 TCompactProtocol:高效压缩的二进制格式 TDenseProtocol:与TCompactProtocol相比,meta信息略有不同 TJSONProtocol JSON TDebugProtocol text 格式 方便调试 thrift传输层transport: TSocket 阻塞的io TFramedTransport 非阻塞io TFileTransport 可以将一组thrift请求写到文件中 TMemoryTransport 使用内存 I/O TZlibTransport 使用zlib压缩 支持的server TSimpleServer 单线程 阻塞 TThreadPoolServer 多线程 阻塞 TNonblockingServer 多线程 非阻塞 THsHaServer api说是TNonblockingServer的扩展,半同步半异步 可定义的数据型: 基本型: bool:布尔值,true 或 false,对应 Java 的 boolean byte:8 位有符号整数,对应 Java 的 byte i16:16 位有符号整数,对应 Java 的 short i32:32 位有符号整数,对应 Java 的 int i64:64 位有符号整数,对应 Java 的 long double:64 位浮点数,对应 Java 的 double string:未知编码文本或二进制字符串,对应 Java 的 String 结构体型: struct:定义公共的对象,似于 C 语言中的结构体定义,在 Java 中是一个 JavaBean 容器型: list:对应 Java 的 ArrayList set:对应 Java 的 HashSet map:对应 Java 的 HashMap 异常型: exception:对应 Java 的 Exception 服务型: service:对应服务的
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值