首页新闻找找看学习计划

前端post数据量过大的解决方案

0
悬赏园豆:50 [已解决问题] 解决于 2015-05-18 09:44

   现在在客户生产环境上发现,请求响应速度很慢,用fiddler跟踪发现前端post的一个xml数据有300kb,客户手机使用的是3G网络,网速30kb/s左右,所以数据传输到服务器花了将近10s,服务器处理数据用了1s,总计11s的时间。这么慢的速度肯定接收不了,求解决方案。

   我能想到的解决方案:

  1.尽量减少post数据量大小 ,这里想到了压缩xml数据,如果能把数据压缩一半,相应速度也会提高一倍。

   那么问题来了,前端能够实现xml的压缩吗

焰尾迭的主页 焰尾迭 | 初学一级 | 园豆:33
提问于:2015-05-16 22:22
< >
分享
最佳答案
0

1、减少提交的数据,没必要的,服务器知道的不要放在数据里面。

2、分段提交,楼上说了。

3、加快连接的速度,3G不行上4G,不行用WIFI。

收获园豆:20
爱编程的大叔 | 高人七级 |园豆:29841 | 2015-05-17 18:28

1.分段提交增加了服务器的压力,

2.客户的网,我们是决定不了的。目前客户大部分使用的3G网络

焰尾迭 | 园豆:33 (初学一级) | 2015-05-18 09:15

@焰尾迭: 我说的是解决思路。

1、XML是比较累赘的。自行组织,去除属性名称,可能就可以减少30%~50%的数据量。

2、如果再考虑只上传修改过的数据(某些场景),又可以减少一些数据量。

3、之所以提带宽问题,是因为有时候解决带宽成本可能比解决技术问题成本来得低。

设想一下,如果你解决这个问题用了365天人工,而解决带宽只是使用市场上已有的方案,可能每个月增加10元。

这个是非技术人员角度考虑,非技术解决方案。

4、最后还是非技术人员角度,考虑为啥会有这么多的数据,是否必要。

爱编程的大叔 | 园豆:29841 (高人七级) | 2015-05-18 09:34
其他回答(6)
0

如果是数组可以转换数据格式,用数组下标取代字段名,可以少掉很多不必要数据

真要自己压缩的话也是可以得,只是不知道服务器会不会自己解压

收获园豆:5
吴瑞祥 | 园豆:28729 (高人七级) | 2015-05-16 22:32

你说的数组的方式是一种方案,可以减少不必要的name。压缩的化有什么好的方案不

支持(0) 反对(0) 焰尾迭 | 园豆:33 (初学一级) | 2015-05-16 22:34

@焰尾迭: 随便一个字符串压缩算法都差不多,常用的就是gzip,不过只能自己写压缩解压。不知道有没现成的。百度了一下,压缩都是服务器响应的压缩,没查到请求的压缩,可能只能自己做了

支持(0) 反对(0) 吴瑞祥 | 园豆:28729 (高人七级) | 2015-05-16 22:55
0

分次post?

收获园豆:15
请叫我头头哥 | 园豆:9382 (大侠五级) | 2015-05-17 00:45

这个不太容易,因为提交的数据是不可分割的,分段提交不太现实

支持(0) 反对(0) 焰尾迭 | 园豆:33 (初学一级) | 2015-05-17 00:46

@焰尾迭: 可以将一个请求的数据项分割, 我之前也遇到这种情况, 就是这么干的

支持(0) 反对(0) 请叫我头头哥 | 园豆:9382 (大侠五级) | 2015-05-17 00:49

@焰尾迭: 只不过不用让用户知道你分割了而已,

支持(0) 反对(0) 请叫我头头哥 | 园豆:9382 (大侠五级) | 2015-05-17 00:49

@请叫我头头哥: 能讲讲方案不,我说下我的情形 比如说我要发的数据是一段表单的数据用xml结构收集的,怎么分段处理

支持(0) 反对(0) 焰尾迭 | 园豆:33 (初学一级) | 2015-05-17 00:51

@焰尾迭: 举个例子, 比如说你的xml根节点是  root, 然后有两个子节点child, 然后child里的数据量都非常大, 你可以将连个child单独弄成两个xml,两次post,  如果还大的话, 就同理拆分child... 以此类推。 然后在后台再将这样xml组成一个xml即可。 这是一个大致思路。 具体怎么做还得看你的业务逻辑。 楼主如果没什么问题的话就采纳吧, 有问题可以继续追问, 服务到你满意为止!  :)

支持(0) 反对(0) 请叫我头头哥 | 园豆:9382 (大侠五级) | 2015-05-17 00:54

@请叫我头头哥: 这样后台就得负责把多段xml数据还原拼接成一个完整的XML,后台该怎么实现这个还原过程呢

支持(0) 反对(0) 焰尾迭 | 园豆:33 (初学一级) | 2015-05-17 00:57

@焰尾迭: 就把child得到以后append到root即可。 麻烦的是处理这个请求(因为不能影响用户体验,不过这个相信也难不倒你。),后台倒是容易实现。

支持(0) 反对(0) 请叫我头头哥 | 园豆:9382 (大侠五级) | 2015-05-17 00:59

@焰尾迭: 楼主,挺晚的了,要不你先采纳, 然后关注下我,以后有类似问题咱们私信聊?

支持(0) 反对(0) 请叫我头头哥 | 园豆:9382 (大侠五级) | 2015-05-17 00:59

@请叫我头头哥: 好的,明天再聊

支持(0) 反对(0) 焰尾迭 | 园豆:33 (初学一级) | 2015-05-17 01:00

@焰尾迭: 行, 反正思路大概是这样, 我之前那个项目遇到的这种情况, 应该比你这个麻烦, 我们最多的时候一个xml分成了57次post才搞定。楼主如果现在还睡不着的话可以继续慢慢研究 - - 晚安。!

支持(0) 反对(0) 请叫我头头哥 | 园豆:9382 (大侠五级) | 2015-05-17 01:04
1

不能改下序列化方案吗? 使用json或protobuf之类传输开销小点的方案。

收获园豆:5
天方 | 园豆:5264 (大侠五级) | 2015-05-17 14:45
0

我的解决方法完全相反..之前那时候我用的只是2G网络,来回调用webservice查询,下载,上传数据什么的感觉好慢..

于是,我尽可能的减少终端与服务器的请求交互次数,比如一个参数查询能获取到的信息,就不要分多次查询...上传估计也是一样的道理吧.

收获园豆:5
hexllo | 园豆:405 (菜鸟二级) | 2015-05-18 08:42
2

一般情况下,代码越写越不对劲时,往往是解决方案出问题了。

好好想想你的解决方案,为什么要在手机上post 300k的xml

paseo | 园豆:262 (菜鸟二级) | 2015-05-18 13:07

这才是问题的关键。

支持(0) 反对(0) wufei | 园豆:338 (菜鸟二级) | 2015-05-18 16:35
1

首先一点,上面的人说的分次提交是一个绝对错误的方案:如果服务器要等你提交完成了全部数据,那么分次提交只会让速度更慢。

其次,一般的,减少数据体积的方案:

1. xml换成json,因为json没有</node>的结束节点

2. json内容也可以压缩,如[{"name":"value1"},{"name":"value2"}],那么在服务器端知道含义的情况下,直接传["value1", "value2"],或者{"field":["name"], "values":["value1", "value2"]},对于1~2行数据可能效果不明显(或者甚至更大了),但是对于行数越多,其压缩效果越好

3. server开启 gzip协议,对文本的压缩效果很好——这要取决于你的服务器和客户端是否支持了

最后,如果上述方法都不行,就要看你的300Kxml内容,针对性的提出解决方案了

小彬 | 园豆:947 (小虾三级) | 2015-05-19 11:17
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册