经过测试发现,在性能方面thrift远远高于http协议
简单比较一下:
1、http协议简单,可以通过json(xml数据格式,数据比较臃肿,解析麻烦,不建议使用)的方式传送数据,而thrift需要设计thrift协议比http复杂。
2、thrift目前文档比较少,在官网只有简单的使用说明文档,http文档一搜一大片。
3、thrift是基于socket,通过tcp协议实现
(a)每次连接、关闭会比较耗性能
(b)客户端主动关闭的Socket端会进入TIME_WAIT状态,并且TIME_WAIT状态一般维持在1-4分钟。而http是无连接、无状态的协议。
通过以上比较和测试,如果基于复杂程度比简单方面使用http,如果基于性能方面建议使用thrift:
在使用thrift方法两点需要注意:
1、server端需要封装一个模块,控制thrift最大连接数
2、client端创建连接池的方式,使用长连接。否则每次请求建立、关闭连接,(a)会有1-4分钟的TIME_WAIT状态,会包连接不上的错误,(b)耗性能
二、测试数据以及方法
测试环境服务器采用公司linux服务器:
服务器:thrift和http的服务器端均采用nodeJs实现
客户端:
thrift测试方法,在本地用java实现多线程模拟发送请求,发送数据{'uid':1,'name':'test','age':25,'desc':'abcdssssssssssssssssssdddddddddddddfffffff'}
http的测试采用ab测试方法,不传递任何参数
1、总共发送10000 request 100client并发
(a)thrift:执行五次时间如下:
681 ms; 543 ms; 604 ms; 542 ms; 576 ms;平均时间:589.2ms ,16972 request/s
(b)http:ab -n 10000 -c 100 http://localhost:9090/
taken for tests:1.059s; 1.186s; 1.311s; 1.195s;1.361s平均时间:1.2224s,8181 request/s
2、总共发送10000 request 200client并发
(a)thrift执行五次时间如下:
570 ms; 582 ms; 659 ms; 570 ms; 621 ms平均时间:600.4ms, 16656 request/s
(b)http:ab -n 10000 -c 200 http://localhost:9090/
taken for tests:1.139s; 1.153s;1.142s; 1.118s;1.143s;平均时间:1.139,8780 request/s
3、总共发送100000 request 100client并发
(a)thrift执行五次时间如下:
3060 ms; 3414 ms;2821 ms; 3915 ms; 3143 ms;平均时间:3270.6ms,30575 request/s
(b)http:ab -n 100000 -c 100 http://localhost:9090/
taken for tests:11.787s;12.115s; 12.051s;11.878s; 11.954s 平均时间:11.957s,8363 request/s
4、总共发送100000 request 200client并发
(a)thrift执行五次时间如下:
3481 ms; 3737 ms; 3276 ms; 3145 ms;3046 ms平均时间:3337ms ,29967 request/s
(b)http:ab -n 100000 -c 200 http://localhost:9090/
taken for tests:12.353s;11.808s;11.926s;13.174s; 12.254s 平均时间:12.303s, 8128 request/s