现在在客户生产环境上发现,请求响应速度很慢,用fiddler跟踪发现前端post的一个xml数据有300kb,客户手机使用的是3G网络,网速30kb/s左右,所以数据传输到服务器花了将近10s,服务器处理数据用了1s,总计11s的时间。这么慢的速度肯定接收不了,求解决方案。
我能想到的解决方案:
1.尽量减少post数据量大小 ,这里想到了压缩xml数据,如果能把数据压缩一半,相应速度也会提高一倍。
那么问题来了,前端能够实现xml的压缩吗
1、减少提交的数据,没必要的,服务器知道的不要放在数据里面。
2、分段提交,楼上说了。
3、加快连接的速度,3G不行上4G,不行用WIFI。
1.分段提交增加了服务器的压力,
2.客户的网,我们是决定不了的。目前客户大部分使用的3G网络
@焰尾迭: 我说的是解决思路。
1、XML是比较累赘的。自行组织,去除属性名称,可能就可以减少30%~50%的数据量。
2、如果再考虑只上传修改过的数据(某些场景),又可以减少一些数据量。
3、之所以提带宽问题,是因为有时候解决带宽成本可能比解决技术问题成本来得低。
设想一下,如果你解决这个问题用了365天人工,而解决带宽只是使用市场上已有的方案,可能每个月增加10元。
这个是非技术人员角度考虑,非技术解决方案。
4、最后还是非技术人员角度,考虑为啥会有这么多的数据,是否必要。
如果是数组可以转换数据格式,用数组下标取代字段名,可以少掉很多不必要数据
真要自己压缩的话也是可以得,只是不知道服务器会不会自己解压
你说的数组的方式是一种方案,可以减少不必要的name。压缩的化有什么好的方案不
@焰尾迭: 随便一个字符串压缩算法都差不多,常用的就是gzip,不过只能自己写压缩解压。不知道有没现成的。百度了一下,压缩都是服务器响应的压缩,没查到请求的压缩,可能只能自己做了
分次post?
这个不太容易,因为提交的数据是不可分割的,分段提交不太现实
@焰尾迭: 可以将一个请求的数据项分割, 我之前也遇到这种情况, 就是这么干的
@焰尾迭: 只不过不用让用户知道你分割了而已,
@请叫我头头哥: 能讲讲方案不,我说下我的情形 比如说我要发的数据是一段表单的数据用xml结构收集的,怎么分段处理
@焰尾迭: 举个例子, 比如说你的xml根节点是 root, 然后有两个子节点child, 然后child里的数据量都非常大, 你可以将连个child单独弄成两个xml,两次post, 如果还大的话, 就同理拆分child... 以此类推。 然后在后台再将这样xml组成一个xml即可。 这是一个大致思路。 具体怎么做还得看你的业务逻辑。 楼主如果没什么问题的话就采纳吧, 有问题可以继续追问, 服务到你满意为止! :)
@请叫我头头哥: 这样后台就得负责把多段xml数据还原拼接成一个完整的XML,后台该怎么实现这个还原过程呢
@焰尾迭: 就把child得到以后append到root即可。 麻烦的是处理这个请求(因为不能影响用户体验,不过这个相信也难不倒你。),后台倒是容易实现。
@焰尾迭: 楼主,挺晚的了,要不你先采纳, 然后关注下我,以后有类似问题咱们私信聊?
@请叫我头头哥: 好的,明天再聊
@焰尾迭: 行, 反正思路大概是这样, 我之前那个项目遇到的这种情况, 应该比你这个麻烦, 我们最多的时候一个xml分成了57次post才搞定。楼主如果现在还睡不着的话可以继续慢慢研究 - - 晚安。!
不能改下序列化方案吗? 使用json或protobuf之类传输开销小点的方案。
我的解决方法完全相反..之前那时候我用的只是2G网络,来回调用webservice查询,下载,上传数据什么的感觉好慢..
于是,我尽可能的减少终端与服务器的请求交互次数,比如一个参数查询能获取到的信息,就不要分多次查询...上传估计也是一样的道理吧.
一般情况下,代码越写越不对劲时,往往是解决方案出问题了。
好好想想你的解决方案,为什么要在手机上post 300k的xml
这才是问题的关键。
首先一点,上面的人说的分次提交是一个绝对错误的方案:如果服务器要等你提交完成了全部数据,那么分次提交只会让速度更慢。
其次,一般的,减少数据体积的方案:
1. xml换成json,因为json没有</node>的结束节点
2. json内容也可以压缩,如[{"name":"value1"},{"name":"value2"}],那么在服务器端知道含义的情况下,直接传["value1", "value2"],或者{"field":["name"], "values":["value1", "value2"]},对于1~2行数据可能效果不明显(或者甚至更大了),但是对于行数越多,其压缩效果越好
3. server开启 gzip协议,对文本的压缩效果很好——这要取决于你的服务器和客户端是否支持了
最后,如果上述方法都不行,就要看你的300Kxml内容,针对性的提出解决方案了