background image

虽然

 thrift 是如此的强大,但是它仍然不是我们想要的, thrift 生成的代码也是强侵入性的,

这样

 pojo 的对象是无法发布服务的。还有一个硬伤是虽然 thrift 的 stack 很强大,当时这和

我们原有系统的

 stack 肯定是不兼容的,如 jboss remoting , spring remoting ,它们都会加

一些

 header 信息,而 thrift 已有实现的传输中式没有 header 信息的。值得一提的是现有的

 

thrift service 实现中,不是线程安全的,考虑到有些语言没有对线程很好的支持,尤其是

 

Facebook 最常用的 PHP 语言,所以现有的实现中没有线程安全 Client 的实现。这样就会造

 client 端 connection 不能复用的问题,相当于短连接了。( ps :其实短连接就真的比长连

接性能差吗?这是个问题。)

总结一下从

 Facebook thrift 学到的东西:

1)              同步,异步都支持,这个很强悍,一般的做法是对性能要求高的服务器端采用
异步方式开发,对易用性有要求的客户端采用同步方式调用,是比较完美的。

2)              从现有的非线程安全的实现看, Facebook 很有可能自己有一套更高效的线程安
全的实现,估计考虑到和

 thrift 关系不到,或者是核心技术,所以没有放出来,其实想自己

做,也不是太难。

3)              Thrift 对很多脚本语言都进行了 native c 的性能优化,如 python 端,采用 native 
c 以后性能提高 20 倍。 Protocol buffers 一直在做这方面的优化,打算在 2.4 中加入,不过

 

protocol buffers 就像 jdk 7 一样难产,跟让人崩溃的是,前不久在论坛爆出做这块优化的哥
们已经离开了

 google ,不再负责了,好吧,我关心的是他去哪儿了,泪奔。

Apache Hadoop avro  Avro is a data serialization system. Avro provides functionality similar 
to systems such as Thrift, Protocol Buffers, etc. 好吧它自己都承认了,我们就不去纠结了。

简单介绍一下,

 avo 是 hadoop 项目下面用来传输数据的一个架构。也是一个跨语言解决方

案。不过

 avro 有自己的亮点。 1 , Dynamic typing, 2 , Untagged data , 3 , . No 

manually-assigned field Ids 

眼前一亮,

 Dynamic typing , oh , my god 。没错, avro 通过将 metadata 放在一个叫

 

schema 的对象里面,然后可以序列化对应的 pojo 兑现。这个正是我想要的,至于其他的特
性,的确没有咋仔细看

 avro ,感觉上比 thrift ,和 protocol buffers 跟难学习,有熟悉的读

者可以给我科普一下。

解决方案:

好了,到了这里,读者大概心里也有数了,

 protocol buffers , thrift , avro 都有我们想要

的和我们不想要的。要解决我们的问题,我们只需要扬长避短就可以了。揉揉就是我们的东
西了。方案如下:

1)  采用 protocol buffers 的 message 序列化格式和代码生成。

2)  采用 thrift 的 service 生成格式,以及实现兼容 jboss remoting 或者 spring remoting 的

 

thrift ( jboss remoting ) stack 。

3)  原有的 pojo 对象采用 avro 的 schema 方式序列化和反序列化该对象。