论坛首页 Java企业应用论坛

实际项目数据下的序列化性能对比:PHPRPC vs Hessian2 vs AMF3

浏览 14600 次
精华帖 (0) :: 良好帖 (13) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-03-18   最后修改:2009-03-18
刚才仔细读了一下 Hessian2 的代码发现它采用了跟 Hessian 不同的机制,Hessian 中是每次序列化对象都会保存对象的完整信息,这个跟 PHPRPC 的 PHP 序列化机制是相同的。而 Hessian2 第一次序列化对象时先写入类定义信息,后写入数据,定义和数据是分离的,之后再写入同样类型的数据时,就只保存字段值不再保存字段名,因此大大的节省了空间。我想 AMF3 应该采用的也是这种机制。因此上面的测试结果 Hessian2 和 AMF3 是类似的,而 PHPRPC 则每次都同样长。

不过在网络传输时,每次只传一个对象的话,这个差别就不大了,但是传输相同类型的列表、字典等数据时, Hessian2 和 AMF3 这两种格式更具优势。
0 请登录后投票
   发表时间:2009-03-18   最后修改:2009-03-18
andot 写道
刚才仔细读了一下 Hessian2 的代码发现它采用了跟 Hessian 不同的机制,Hessian 中是每次序列化对象都会保存对象的完整信息,这个跟 PHPRPC 的 PHP 序列化机制是相同的。而 Hessian2 第一次序列化对象时先写入类定义信息,后写入数据,定义和数据是分离的,之后再写入同样类型的数据时,就只保存字段值不再保存字段名,因此大大的节省了空间。我想 AMF3 应该采用的也是这种机制。因此上面的测试结果 Hessian2 和 AMF3 是类似的,而 PHPRPC 则每次都同样长。

不过在网络传输时,每次只传一个对象的话,这个差别就不大了,但是传输相同类型的列表、字典等数据时, Hessian2 和 AMF3 这两种格式更具优势。

这应该也是phprpc可以改进的地方,传递列表数据、字典、队列在实际应用中是十分频繁的动作。
0 请登录后投票
   发表时间:2009-03-18  
andot,JAVA版phprpc在连续调用下还有一个问题,就是调用后,读取response有问题,造成调用失败的假象(抛异常),实际上是调用成功了。如有A、B、C、D四个类,在连续调用A.xxx(),B.xxx(),C.xxx(),D.xxx()时,经常a.xxx()方法读不到response,其它3个却返回200OK。是不是有什么注意的地方?
我把A.xxx(),B.xxx(),C.xxx(),D.xxx()调用时同步一下就没有问题了,请指点是应该如何避免?谢谢
0 请登录后投票
   发表时间:2009-03-18  
fight_bird 写道
andot 写道
刚才仔细读了一下 Hessian2 的代码发现它采用了跟 Hessian 不同的机制,Hessian 中是每次序列化对象都会保存对象的完整信息,这个跟 PHPRPC 的 PHP 序列化机制是相同的。而 Hessian2 第一次序列化对象时先写入类定义信息,后写入数据,定义和数据是分离的,之后再写入同样类型的数据时,就只保存字段值不再保存字段名,因此大大的节省了空间。我想 AMF3 应该采用的也是这种机制。因此上面的测试结果 Hessian2 和 AMF3 是类似的,而 PHPRPC 则每次都同样长。

不过在网络传输时,每次只传一个对象的话,这个差别就不大了,但是传输相同类型的列表、字典等数据时, Hessian2 和 AMF3 这两种格式更具优势。

这应该也是phprpc可以改进的地方,传递列表数据、字典、队列在实际应用中是十分频繁的动作。


嗯,不过目前 PHPRPC 的序列化方式没办法在这一点上进行改进了,只能通过重新设计序列化方式(就像 Hessian 进化为 Hessian2 那样)来改进这点。这个是个大改动,将会与目前的版本不兼容。所以,如果到时候决定要这么做的时候,会考虑改个名字,并且对协议本身做一个相对较大的调整,使之更加高效。呵呵。
0 请登录后投票
   发表时间:2009-03-18   最后修改:2009-03-18
killer2008 写道
andot,JAVA版phprpc在连续调用下还有一个问题,就是调用后,读取response有问题,造成调用失败的假象(抛异常),实际上是调用成功了。如有A、B、C、D四个类,在连续调用A.xxx(),B.xxx(),C.xxx(),D.xxx()时,经常a.xxx()方法读不到response,其它3个却返回200OK。是不是有什么注意的地方?
我把A.xxx(),B.xxx(),C.xxx(),D.xxx()调用时同步一下就没有问题了,请指点是应该如何避免?谢谢


您是说在异步调用的情况下,连续发起4个不同的调用会出现这种情况吗?能不能说一下抛出的异常是什么,这样我才比较容易判断是哪里的问题。另外,向这类具体的问题在群里讨论会更容易得到及时的答复。
0 请登录后投票
   发表时间:2009-03-20  
是报java.lang.NumberFormatException,应该是PHPRPC_Client类中读取HTTP status code时没读到,因为读取response有问题,你解析状态码用了Integer.parseInt(XXX),这里XXX不为数字,所以有问题。

单错调一个接口方法是没有问题的,连续并发调用几个接口方法时才会出现,我的环境是客户端与服务端都运行在同一台机器上。
0 请登录后投票
   发表时间:2009-03-21  
killer2008 写道
是报java.lang.NumberFormatException,应该是PHPRPC_Client类中读取HTTP status code时没读到,因为读取response有问题,你解析状态码用了Integer.parseInt(XXX),这里XXX不为数字,所以有问题。

单错调一个接口方法是没有问题的,连续并发调用几个接口方法时才会出现,我的环境是客户端与服务端都运行在同一台机器上。


明白,我把这里改一改,看看到底返回的是什么错误。可是 Response 读取有问题这个很奇怪,因为每个 socket 都是独立的,不会产生混乱才对。也许是系统本身限制了连接总数,超过之后或许就不能用了。
0 请登录后投票
   发表时间:2009-03-21   最后修改:2009-03-21
andot 写道
killer2008 写道
是报java.lang.NumberFormatException,应该是PHPRPC_Client类中读取HTTP status code时没读到,因为读取response有问题,你解析状态码用了Integer.parseInt(XXX),这里XXX不为数字,所以有问题。

单错调一个接口方法是没有问题的,连续并发调用几个接口方法时才会出现,我的环境是客户端与服务端都运行在同一台机器上。


明白,我把这里改一改,看看到底返回的是什么错误。可是 Response 读取有问题这个很奇怪,因为每个 socket 都是独立的,不会产生混乱才对。也许是系统本身限制了连接总数,超过之后或许就不能用了。


基本上可以排除连接数的问题。如果需要,我可把几次调用的requestBody与reponse给你贴出来。再说明下,就是response读取有问题的调用实际上也是成功的。
0 请登录后投票
   发表时间:2009-03-22  
killer2008 写道
andot 写道
killer2008 写道
是报java.lang.NumberFormatException,应该是PHPRPC_Client类中读取HTTP status code时没读到,因为读取response有问题,你解析状态码用了Integer.parseInt(XXX),这里XXX不为数字,所以有问题。

单错调一个接口方法是没有问题的,连续并发调用几个接口方法时才会出现,我的环境是客户端与服务端都运行在同一台机器上。


明白,我把这里改一改,看看到底返回的是什么错误。可是 Response 读取有问题这个很奇怪,因为每个 socket 都是独立的,不会产生混乱才对。也许是系统本身限制了连接总数,超过之后或许就不能用了。


基本上可以排除连接数的问题。如果需要,我可把几次调用的requestBody与reponse给你贴出来。再说明下,就是response读取有问题的调用实际上也是成功的。

你加群吧(48855729),那里交流比较快。
0 请登录后投票
   发表时间:2009-03-24   最后修改:2009-03-24
fight_bird 写道
互联网应用中rpc传输过程序列化方案的几点思考:
1、空间,这是第一要求,基于互联网的传输,网络传输的数据量是最关键的指标,这直接关系到UI用户体验,尤其是在大负载的应用中,AMF3宁愿牺牲时间换取空间,应该是有这方面的考虑。
2、时间,序列化/反序列化的时间代价是客户端和服务器各承担一半,所以时间代价稍大是可以接受的。

就我测试结果:1万5条记录,若一次发送给客户端,phprpc的数据量是186M,Hessian才4M,40多倍的空间差距实在太大,这直接会导致B/S结构应用中网络传输数据量剧增40多倍!这是无法承受的,所以目前PHPRPC在复杂对象序列化的对象字段处理机制上必须改善,要更灵活和实用,否则,phprpc是很难在存在大数据量复杂对象传输的B/S结构中使用,而对于企业应用和稍复杂的互联网应用,此类场景是频繁出现的。

在应对大数据量复杂对象传输的场景中,phprpc需要改进。

1.实际基于HTTPService的数据传输,基本上都是要开GZIP的,例如基于JSON或者XML的这类文本传输,要测试网络流量建议打开HTTPServer的GZIP再测。

2.还有一个问题就是,即使做RIA应用,也没必要一次性传输1万5千多条记录吧,网络应用不是这么做的。对应到架构上,虽然RPC可以直接调用Service层的方法,但是一般不会不加限制的随意调用的(例如某个公用方法,查询某张表中的所有记录)。

3.很多互联网应用最占带宽的是图片(不考虑利用序列化传图片),而不是文本,相对图片,文本本来就小,再加上GZIP一开,更小。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics