Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

数据差异化加载设想

  我们在使用版本控制工具时可以看到文件的哪个部分被修改了。在更新时,服务器和客户端之间只需要传输被修改的部分,不需要传输整个文件。这是非常机智的做法!既然有如此美好的东西,为什么在Web通信协议中没有被引入呢?我觉得这玩意儿真可以有!
  对于网页而言,每次的修改实际上只是修改了很少的一部分内容,大部分数据我们都在重复传输。所以有了各种前端模板框架,它们的作用就是让模板不变,只对数据部分更新。但这是有局限性的,因为可以通过模板输出的数据都是结构化的数据,它们本身就很容易处理。如果是非结构化的数据就无法通过模板来输出了。比如一篇上万字的文章中修改了个标点符号,那么用户再次访问这篇文章时怎么办?是重新加载全文呢?还是重新加载全文呢?目前最普遍的做法就是对这种情况重新加载全文!
  这很不科学嘛!为了修改只有几个字节的东西需要重新加载整个数据。我们可不可以告诉客户端是什么部分被修改了,让客户端自己去修改上一次传输过去的数据呢?这当然是可以的,只是在此之前需要解决一个问题。服务器端在将新的数据传输给客户端时如何得知客户端已经持有的数据呢?在版本控制工具中,它会存储所有版本的数据。每个数据都有一个唯一的数字签名,这样客户端只要告诉服务器自己所持有的数据的数字签名,服务器就可以知道客户端所持数据的版本。但服务器保存这些版本信息所需的开销也不小,对于更新频率不高的内容而言,这确实是一种好方法,因为不会占用太多服务器资源!而对更新频率高的内容或许可以试着只保存最新的若干个版本,对客户端版本过旧的直接更新全文。
  数据控制方面的问题应该都可以解决。另一个关键点是字符串的diff算法性能问题。拿出两个字符串,要计算出它们之间的差异,还要对其序列化,这并不简单。如果我们想计算出高质量的结果可能需要很大的服务器开销,可以考虑稍微降低diff算法结果的质量来保证效率,所以应该选择合适的diff算法很重要。另外,我们还应该尽量减少计算,把已经计算出的结果保存下来以免重复计算浪费资源。
  最后的关键点是如何在Web中引入。在Web上,最方便的传输方式就是HTTP了,所以如果没有特殊需求我还是推荐使用HTTP。而且由于每个数据都有版本的唯一ID,这可以直接利用HTTP的ETag来实现。但在这个做法中,客户端需要对数据操作和保存,所以不能简单地使用HTTP缓存来存储。因为HTTP缓存对于客户端而言是只读的。当数据更新后客户端还需要保存新的数据,所以客户端需要对数据拥有写的权限。最简单的做法就是使用localStorage来储存,这也是我推荐的做法。至于传输的内容,这需要开发者自己约定一个格式,因为这和正常请求不同,服务器响应的内容不是完整数据,而是一个用于描述数据修改的序列。比如前面的例子,一篇上万字的文章中修改了一个标点符号的情况,请求得到的结果可能只是一个这样的操作描述“删除第n行,在第n行插入xxx”。当然我们不会用自然语言来描述,这通常是开发者自己约定的一串符号化的描述,因为我们追求的是使用尽量少的字节描述尽量多的东西。
  以上就是这个想法的全部内容。但目前我还没有实施过,关键是我还没有找到一个合适的diff算法,也许过段时间会试试看。
网名:
54.144.24.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^