跨语言RPC框架Hessian、Thrift、Protocol Buffer之间的选择

时间:2021-08-20 08:27:30

总结在几者之间选择的考量:

1. 如果你不需要很多语言相互调用, 希望保持清晰的java接口代码(无任何业务不相关的接口继承和方法,属性定义),减少开放工作量,推荐Hessian。

2. 如果你的系统之间传输的数据量不是很大(<2M都不算大), 推荐Hessian。

3. 如果需要支持大数据量的传输,多语言调用,极高的并发支持,推荐使用thrift/protocol buffer。 通常我们并发很难超过1000 req/s,如果超过1000 req/s,在国内互联网排名绝对前5,那么恭喜你。因此一般而言,用Hessian就够了。

=====================================================================================


最近重新考察了各种RPC解决方案,感觉最初的xmlrpc确实在技术上已经有些落后了。

最初考虑的替代方案是采用hessian,原来没有采用这一方案的原因之一是hessian最初只能是现java到java的访问,另外hessian需要web容器的支持。没想到两年时间hessian已经发展到了多语言支持,并且采用Jetty嵌入web容器也变得非常简单,因此首先对hessian 进行了尝试,发现xmlrpc到hessian的转换非常容易,尤其是使用纯java的情况,转换的代价非常小,性能也有显著的提高,对于最关心的二进制数据传输,性能提高了一倍多一点,感觉很满意。

由于有了Jetty,接下来考察了使用纯servlet方案,虽然不够灵活,但性能上能够比hessian快一点。

经过上述测试,基本上确认了,采用http协议的情况下,采用hessian比较适当,在一些关键点,可以采用自定义的servlet,性能上能够进一步提高。

本想下一步直接测试ICE的性能,由于最近google发布了protocol buffers,因此对这一类的技术产生了兴趣,首先考察了protocol buffers,但是目前提供的代码中,虽然对于RPC留有了接口,但并没有提供直接的实现,因此暂时放在一边。在查找protocol buffers的过程中,与其类似的thrift落入了眼帘,接下来对thrift进行了考察,经过简单地测试,发现thrift在开发方面相当简单,而且性能也有明显的提高,相比hessian,有将近80%的提高。测试过程中存在一点点插曲,由于thrift的文档过于简单(估计没有及时更新),其中没有对二进制数据类型进行说明,因此最初采用List<Byte>对二进制数据进行封装,性能极其低下,通过查找mail list,发现可以直接使用binary类型,测试了一下,结果很理想。

从目前来看,基于中间描述的协议,例如corba的idl,protocol buffers的proto,thrift的ThriftIDL,ice的slice,这些协议可以通过中间描述生成代码,数据的编码和解析具有很好的性能,而基于直接类型的协议如xmlrpc,hessian等,则必须采用反射的方法进行编码和解析,性能相对较低。

由于ICE的文档太多,总是下不了决心攻读一下,不过这次决心一定要对各种协议做一个全面的对比,下一步的重点将是ICE。


=====================================================================================

http://*.com/questions/461319/would-you-recommend-google-protocol-buffers-or-caucho-hessian-for-a-cross-langua


http://www.beyondlinux.com/2011/06/02/%E9%80%9A%E4%BF%A1%E5%8D%8F%E8%AE%AE%E4%B8%8E%E5%BA%8F%E5%88%97%E5%8C%96%E6%96%B9%E6%A1%88%E7%9A%84%E7%BA%A0%E7%BB%93-protocol-buffer-thrift-or-hessian/


http://shiyanjun.cn/archives/499.html


我更想知道的是如何在TCP/UDP上封装为RPC!!!!!!!!!!!!