最近在对一个项目进行重构,由于项目采用的是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:暂无标签

留言反馈
所以我认为压缩后再传输只适用于压缩一次,但要进行很多次的传输才会提高效率,比如资源下载等等,如果说为了一次的数据交互而压缩数据,可能会得不偿失.慎重考虑!
已经有很多paper论证过这一点了,有兴趣得可以自己去看一下
之所以用WEB Service还是跨平台的诱惑,如果不考虑跨平台Remoting好了,灵活性和性能都会好很多
2、Byte Stream无法穿透防火墙;
我们的做法很简单:不用WSE,直接发送请求到远程服务器(WebService),返回地址,直接HTTP下载文件,呵呵。
不应该交给ws很多的查询结果, 太多了用户也不可能全部看过, 也许应该想办法让数据一步到位. 通过repor tserver呢?
还能提供个进度条了 :)
的确如此:),传txt、doc、bmp的时候,因为压缩率高的缘故,传输“速度”快很多,传zip、jpg的时候,就露出真面目了...
要看传什么格式的文件了,如果传一个未压缩过的文本文件,应该会有比较大的性能改善,假如你传递的是一个已经压缩过的ZIP文件,或者是JPG图片,MPEG视频等等,用GZIP压缩几乎等于没压缩 :)
素啊素啊,可以http/bin的
我以前用WS来传递文件,My God,什么手段都用上了,Base64、gzip...后面将文件分割后多线程同时上传...还是慢...深刻的教训,呜呜...
2.REMOTING可以配置为使用HTTP+Binary formatter的方式
这样的话为什么不直接用remoting(TCP/Binary)?Mono不支持吗?