Luyan

追求,探索,研究,创新...
随笔 - 58, 评论 - 663, 引用 - 54

导航

关于


标签

每月存档

最新留言

广告

 

最近在对一个项目进行重构,由于项目采用的是Web Services与服务器通讯,所以传输效率一直是一个很头痛的问题,特别是在大数据量的时候,于是提高WS的传输速度就作为重构的一个重要目标之一.

我一共设想了三个方法:

1. 尽量避免SOAP格式序列化,这点虽然我没有验证过,但是我感觉相对与BASE64编码来说,SOAP编码的处理会更加复杂,所以,首先把所有要传输的对象全部通过BinaryFommatter序列化成二进制流,通过byte[]参数的方式传递,WS会将byte[]编码为BASE64,在另一段接收到之后再反序列化.这样还有个额外的好处,就是可以传递本来WS不允许的一些对象,比如DataTable.

2.如果只采用第一个方法,可能效果不明显,所以将序列化后的二进制流用GZIP算法实时压缩后再发送(相应在另一端必须实现首先进行解压缩后再进行反序列化),这一步应该是提高速度的关键,一般数据在压缩后会变成原来的十分之一还不到,在经过这两步之后,速度已经提高到原来的7-8倍,根据我的实测,在2M的ADSL上如果采用原来的方式传递一个1000行数据的DataSet需要3秒,改进后只需要要0.5秒.如果在连接速度更低的网络环境下,效率可能会有更大的改善.

3.假如数据量太大,即使压缩后也很夸张,那么还可以跳过BASE64编码,直接使用二进制流的方式传递数据,要达到这点需要借用WSE中的Attachment功能,将压缩数据包作为一个附件上传.不过这种方式只是我的设想,我并没有这么做过,因为我的服务器端将来可能会使用LINUX,但我还没测试过MONO能不能支持WSE(估计是不能吧).

可能会有人说这种方式不能跟异构平台通信,比如J2EE,那确实是没办法了,因为我从来就没考虑过要和J2EE连接.

打印 | 张贴于 2004-05-28 14:49:00 | Tag:暂无标签

留言反馈

#回复: 三个步骤提高Web Services十倍传输速度 编辑
不和J2EE等异构系统连接,你这个webservie设计就是不可取的,失败的。
2007-07-03 16:43:00 | [匿名:HEDY]
#从WEB SERVICE 上返回大数据量的DATASET[转] 编辑
众所周知,如果不用其它方法,直接从WEBSERVICE上传回一个10W条记录的DATASET,可想而知的后果是什么,CPU要占用100%,且要等上几分钟,这是任何一个项目都无法忍受的.在我上网找资...
2007-04-24 15:55:00 | [匿名:DongD]
#回复: 三个步骤提高Web Services十倍传输速度 编辑
用WEB SERVICE 速度太慢,在的局域网上有时还是不行
2007-03-01 22:33:00 | [匿名:陈]
#回复: 三个步骤提高Web Services十倍传输速度 编辑
用WEB SERVICE 速度太慢,在的局域网上有时还是不行
2007-03-01 22:33:00 | [匿名:陈]
#回复: 三个步骤提高Web Services十倍传输速度 编辑
用WEB SERVICE 速度太慢
2007-03-01 22:30:00 | [匿名:陈]
#从WEB SERVICE 上返回大数据量的DATASET 编辑
前段时间在做一个项目的时候,遇到了要通过WEBSERVICE从服务器上返回数据量比较大的DATASET,当然,除了显示在页面上以外,有可能还要用这些数据在客户端进行其它操作。查遍了网站的文章,问了一...
2006-12-21 16:22:00 | [匿名:马建康]
#从WEB SERVICE 上返回大数据量的DATASET 编辑
前段时间在做一个项目的时候,遇到了要通过WEB SERVICE从服务器上返回数据量比较大的DATASET,当然,除了显示在页面上以外,有可能还要用这些数据在客户端进行其它操作。查遍了网站的文章,问了一些朋友,也找了一些解决方法.
2006-05-09 15:14:00 | [匿名:Retry]
#re: 三个步骤提高Web Services十倍传输速度 编辑
同意wtao的观点.我曾经为了将一个2G的文件带走,先压缩后再拷贝,结果跟直接拷贝用的时间差不多,因为压缩同样会消耗大量的时间.
所以我认为压缩后再传输只适用于压缩一次,但要进行很多次的传输才会提高效率,比如资源下载等等,如果说为了一次的数据交互而压缩数据,可能会得不偿失.慎重考虑!
2005-12-29 11:21:00 | [匿名:cbo]
#re: 三个步骤提高Web Services十倍传输速度 编辑
楼主给个实例先。。
2005-12-01 09:22:00 | [匿名:JACKIE]
#re: 三个步骤提高Web Services十倍传输速度 编辑
如果用GZIP得话,加上2端CPU得开销,结果是得不偿失!
已经有很多paper论证过这一点了,有兴趣得可以自己去看一下
2005-05-08 23:14:00 | [匿名:wtao]
#re: 三个步骤提高Web Services十倍传输速度 编辑
我靠
2004-09-17 16:17:00 | [匿名:仁]
#回复: 三个步骤提高Web Services十倍传输速度 编辑
数据量小时,压缩一样会损失性能,减少数据量的效果却不理想,得不偿失,要分开考虑是否需要压缩.
之所以用WEB Service还是跨平台的诱惑,如果不考虑跨平台Remoting好了,灵活性和性能都会好很多
2004-06-04 10:15:00 | [匿名:大坏蛋]
#回复: 三个步骤提高Web Services十倍传输速度 编辑
1、压缩的话,服务器有相当压力;
2、Byte Stream无法穿透防火墙;

我们的做法很简单:不用WSE,直接发送请求到远程服务器(WebService),返回地址,直接HTTP下载文件,呵呵。
2004-05-31 16:25:00 | [匿名:unruledboy]
#回复: 三个步骤提高Web Services十倍传输速度 编辑
有时候不一定是直接发给用户看的,可能要先经过客户端程序的下一步的处理,当然你说的方法是一种从设计上解决问题的办法,是另一个层面上的思路
2004-05-31 10:36:00 | [匿名:5drush]
#回复: 三个步骤提高Web Services十倍传输速度 编辑
如果是数据下传就累了, ws下传完了再转接励给应用程序...
不应该交给ws很多的查询结果, 太多了用户也不可能全部看过, 也许应该想办法让数据一步到位. 通过repor tserver呢?
2004-05-30 23:45:00 | [匿名:steeven]
#回复: 三个步骤提高Web Services十倍传输速度 编辑
如果只是应用在LAN内的话,速度根本不是去需要解决的问题,而且由于没有防火墙的关系,那真的是没有必要采用WEB SERVICES了
2004-05-30 22:39:00 | [匿名:5drush]
#回复: 三个步骤提高Web Services十倍传输速度 编辑
窄带内的效果应该是比较明显。但是如果在LAN内的话,考虑到压缩和解压缩的时间,也许效果就不会那么好了。没有经过测试,只是纯粹的推测。
2004-05-30 15:26:00 | [匿名:疯铃]
#回复: 三个步骤提高Web Services十倍传输速度 编辑
问题在于你并不知道数据量有多大,比如查询,你不知道你的查询是查出来一万条还是只有一条数据
2004-05-30 09:59:00 | [匿名:5drush]
#回复: 三个步骤提高Web Services十倍传输速度 编辑
既然饶不过去,为什么不把大量数据拆分成多个小包传输呢?
还能提供个进度条了 :)
2004-05-29 21:29:00 | [匿名:steeven]
#回复: 三个步骤提高Web Services十倍传输速度 编辑
有完整得测试过asp.net, Webservice在mono上跑吗?一直想测试一下,都抽不出时间,希望告知,谢谢。
2004-05-29 11:44:00 | [匿名:jacky]
#回复: 三个步骤提高Web Services十倍传输速度 编辑
to 5drush:
的确如此:),传txt、doc、bmp的时候,因为压缩率高的缘故,传输“速度”快很多,传zip、jpg的时候,就露出真面目了...
2004-05-28 22:28:00 | [匿名:kaneboy]
#回复: 三个步骤提高Web Services十倍传输速度 编辑
to kaneboy :
要看传什么格式的文件了,如果传一个未压缩过的文本文件,应该会有比较大的性能改善,假如你传递的是一个已经压缩过的ZIP文件,或者是JPG图片,MPEG视频等等,用GZIP压缩几乎等于没压缩 :)
2004-05-28 21:52:00 | [匿名:5drush]
#回复: 三个步骤提高Web Services十倍传输速度 编辑
我在MONO BETA1中没有发现关于Attachment的资料,至于http/bin的remoting,既然走的是HTTP通道,传输的原理应该和这种WS方式差不多,估计效率也不会相差太多,何况WSE2.0还可以走专用端口用BINARY传输,效率也不比REMOTING的BINARY通道差,到了这个地步,WEB SERVICE和REMOTING从功能和性能上分的话,界限已经很模糊了,不过借用MVM的说法,WS比REMOTING要“轻”,至于你选择WS还是REMOTING已经是属于仁与智之选了。
2004-05-28 21:31:00 | [匿名:5drush]
#回复: 三个步骤提高Web Services十倍传输速度 编辑
"2.REMOTING可以配置为使用HTTP+Binary formatter的方式 "

素啊素啊,可以http/bin的
2004-05-28 16:59:00 | [匿名:rIPPER]
#回复: 三个步骤提高Web Services十倍传输速度 编辑
总而言之,WS传大量数据的效率不高...

我以前用WS来传递文件,My God,什么手段都用上了,Base64、gzip...后面将文件分割后多线程同时上传...还是慢...深刻的教训,呜呜...
2004-05-28 16:52:00 | [匿名:kaneboy]
#回复: 三个步骤提高Web Services十倍传输速度 编辑
1.SOAP Attachment是标准
2.REMOTING可以配置为使用HTTP+Binary formatter的方式
2004-05-28 16:49:00 | [匿名:Jacob_Bubu]
#回复: 三个步骤提高Web Services十倍传输速度 编辑
我就是使用的Remoting,且打算对应大量数据使用zip
2004-05-28 16:47:00 | [匿名:redmoon]
#回复: 三个步骤提高Web Services十倍传输速度 编辑
REMOTING的BINARY方式不能通过防火墙,假如挂在HTTP频道的话,REMOTING也采用的是SOAP格式
2004-05-28 16:39:00 | [匿名:5drush]
#回复: 三个步骤提高Web Services十倍传输速度 编辑
gzip? google一下吧,又不难找,或者去sourceforge看看
2004-05-28 16:23:00 | [匿名:rIPPER]
#回复: 三个步骤提高Web Services十倍传输速度 编辑
不考虑异构,还不如用remoting
2004-05-28 16:00:00 | [匿名:feilng]
#回复: 三个步骤提高Web Services十倍传输速度 编辑
GZIP压缩有现存原类使用吗?老大。
2004-05-28 15:27:00 | [匿名:雷俊强]
#回复: 三个步骤提高Web Services十倍传输速度 编辑
"可能会有人说这种方式不能跟异构平台通信,比如J2EE,那确实是没办法了,因为我从来就没考虑过要和J2EE连接."

这样的话为什么不直接用remoting(TCP/Binary)?Mono不支持吗?
2004-05-28 15:15:00 | [匿名:rIPPER]
对不起,目前本随笔不允许发表新评论.

Powered by: Joycode.MVC引擎 0.5.2.0