前端与后端进行差异传输的问题总结
前端与后端进行差异传输的问题总结
去年实践了一个差异传输的案例,做过一些修改,方案大致是这样的,我在这里做一个总结,记录曾经遇到过的问题。
背景:
web前端有很多张表单需要用户填写、修改,然后保存到数据库中。由于表单的数据量比较大,前端web数据以Json串压缩的方式传输数据到后端,这已经是已知数据传输所能做到的极限了。问题是在新增、修改数据的时候,前后端的数据交换依然很大,从10k到1M的级别,这时候就需要新增一种机制来解决这个问题,否则速度就太慢了。
解决方案:
采用差异传输的方式。
原理:
每次传入、传出的数据都做一个比较,如果数据相同,则去掉这些数据,只留下关键字和不相同的字段。
这里面牵扯到几个要点:
1 需要写一个传入、传出数据的公共方法。传入 、 传出参数需要定义成 数组、List 、map等形式,里面的属性 必须 是可变动的。
2 关键字的选择问题,一般留下主键、时间戳、操作状态(例如新增、修改、删除状态)等字段,其他字段就可以删减了。
3 对象的创建构造问题、深拷贝克隆问题、操作状态判断问题 。比如传入传出对象的基类要一致,基类继承接口,差异比较算法需要设置成泛型。这是一个比较庞大的架构。如果一开始设计不好,就很难统一起来。假如这个架构做好了,今后再出现的每一种例外情况,都需要做周密的考量,否则有可能就用不了这个差异传输机制。
4有可能前端会传入一些冗余字段到后台,后台也有可能传出一些冗余字段到前端,这些冗余字段指的是不做持久化的一些字段,比如前端计算、后端计算的字段。这里就得注意了,这些冗余字段的处理一定要在差异处理函数的前后,否则数据会丢失。
(一)新增:
前端填好数据,点击保存,这时数据传到后台保存,保存后,数据还必须同步传输到前端,比如后端生成的一些ID、时间之类的字段,两方数据做一个比对,留下关键字和必须的字段。
(二)修改:
前端需要做一个传入参数的比较,只传关键字、增量数据到后台,后台通过传入参数查询数据库,还原整个对象,然后再做验证、更新等操作,做完后再次与传入参数做比较,留下关键字、增量数据返给前端。
(三)删除:
前端传入关键字段,后端还原整个对象,然后走各种验证,验证通过后才走删除操作。