Thrift之TProtocol类体系原理及源码详细解析之稠密协议类TDenseProtocol
我的新浪微博:http://weibo.com/freshairbrucewoo。
欢迎大家相互交流,共同提高技术。
这个协议类不建议投入到实际的生产环境(除非自己做了很强的压力和全面的测试)。这个密集协议的最大作用就是尽可能使用小的空间,密集协议类有两种类型的实例对象,一种是独立的,它不被使用在rpc通信中,而只是用于编码和解码;另一种是非独立的实例类型,它可以用于rpc通信,不过现在还不支持这种类型的实例。
要使用这个密集协议类来进行编码和解码必须支持Thrift自己实现的一直特殊的记录数据类型形式:就是type_spec属性,它的主要作用就是用于本地化反射机制来进行读写数据。
最佳的实践方法如下:
(1)永远不要使用可选的原语或容器类型;
(2)如果数据类型非常的大或非常的稀少那么使用结构体类型(struct);
(3)所有整数类型使用可变长的,能够使用i64类型避免膨胀;
(4)永远不要以任何方式修改结构体的定义而不改变换成的键,否则会造成恐慌的错误。
这个密集协议类继承至二进制协议类,所以可以直接使用二进制协议类的一些协议方法。
那么这个协议类相比前面的协议类又有什么优势和不足。既然这个协议类是后面逐渐发展起来的,那么它肯定有自己的优势和适合的应用场景,据我学习之,它的优势如下:
(1)相比较二进制协议它使用了可变长编码,当然紧凑协议类也实现了这个来减少整数型数据的传输流量,那么它相对于紧凑协议类又有什么优势?请看下面一条;
(2)相对于紧凑协议类它减少了一部分元数据的传输,例如struct结构里面的字段id和数据类型,这样就极大的减少了流量,当然速度也就自然提升了不少。
虽然它有这些优势,但是它的缺陷也是比较明显的,主要有以下三点:
(1)抽象将失去效果;
(2)必须维持第二个代码生成器;
(3)想要保持与旧版本的兼容将是是非常困难的。
通过它的优势和缺陷的分析发现,它们都是那么的鲜明,所以选择这个协议作为传输层之上的协议类型需要经过比较慎重的考虑,优点其实就是靠牺牲抽象性、易维护和向前兼容来提升数据传输速度和减少流量。
那么实现这个协议类需要用到什么特殊的技术,通过代码和注释发现,主要两点技术,一个是可变长编码,这个在紧凑协议类中已经实现和介绍;另一个技术就是消除一些传输的元数据。消除元数据的传输需要支持Thrift的编译器和牺牲一些二进制协议的向前和向后的兼容性。
上面分析了密集协议类的优秀和不足,但是就目前而言这个类还是处于试验的阶段,不能投入真正的生产环境,所以就不具体分析代码的实现了,有兴趣的同仁们可以自己看看代码的实现,使用到的技术前面已经介绍了。