delphij's Chaos

选择chaos这个词是因为~~实在很难找到一个更合适的词来形容这儿了……

25 Oct 2009

客户端应该去计算什么?

这是一个很有意思的话题:随着计算机技术的发展,客户端的计算能力越来越强。想要提高在服务器端运行的系统的负载能力,最直接有效的办法就是把计算任务尽可能交给客户端去做,并减少两者之间的交互;然而,另一方面,这样做又可能会带来一些其他问题,例如,客户端完成某些计算任务的时候可能会比较慢(因为在客户端可以用到的资源比较少,想要保持兼容性最好的办法就是只使用普适的Java Script子集),或者,作为安全系统的一个最基本的原则,任何来自外界的数据都是不应被信任的,等等。

我们可以把数据根据一些规则来进行分类。一般来说数据会具有一些这样的属性:

  • 传输方向。数据是服务器发给客户端的?还是反过来?或者,只是在客户端兜个圈?或者在两台服务器之间传递,只不过客户端是一个中间的载体(当然一般来说,这样做的系统的架构师应该去看看神经科的医生)?
  • 敏感性。如果数据在传输过程中(从客户端到服务器,或反过来)被人截获,是否会产生安全威胁?
  • 尺寸。这个主要是从经济方面考虑,不过多增加计算量的前提下,通常我们会希望传输的尺寸越小越好。

这样一来,判断计算是否应在客户端进行就比较简单了:我们首先要看的第一个问题是:放在客户端进行,是否会增加服务器的计算量?例如,服务器是否需要再增加一些额外的步骤,才能够完成具体的操作?这些额外的步骤与原先的计算相比是否更少?通常来说,这个答案都是"是的",这样我们可以继续考察第二个问题。

第二个问题是,这样做是否有助于减少通讯量?例如,对于用户输入信息的合法性检查,比如说,用户输入的内容是否可能导致SQL注入,或者,他是否在一个该输入数字的地方输入了其他字符?这些检查很显然必须在服务器端做(因为数据跨越了安全边界),但是,假如客户端也进行了这些检查的话,那么那些无效输入就可以在与服务器交互之前被拦住,从而减少通讯量并减少服务器的负担。

第三个问题是,这样做是否会占用太多客户端资源?这个问题可能不太容易评估,一般来说,计算密集型的任务使用Java Script去做的效果有可能会不太好,有时,为了改善响应时间,有可能会希望这些操作由服务器去完成(由于可以采用任意的软件,因此服务器完成某些任务可能更高效)。简单的排序操作在客户端做有助于减少服务器负载,但如果很多客户端需要请求同样的内容,那么将排序结果在服务器端直接缓存起来就会更好一些,等等。

以上仅代表个人经验供参考。