服务器端逻辑还是客户端逻辑?

7 views
Skip to first unread message

朱涛 Tower Joo

unread,
Oct 4, 2009, 10:40:12 PM10/4/09
to pyth...@googlegroups.com, pon...@googlegroups.com
大家好!

在做过几个基于web的项目后, 碰到了一个比较难把握的问题: 在实现同一个功能时, 我们应该选择服务器端逻辑还是客户端的逻辑?

举个简单的例子:
功能: 我现在想动态地显示一个页面
方案1: 服务器端的逻辑: 从数据库里取出数据使用服务器端代码(PHP,python)来生成格式化后的页面,返回给客户端, 然后客户端直接显示.(所谓的more server side logic, less client side logic)
方案2: 客户端的逻辑: 从数据库里直接取出数据, 并不格式化,而是以json或者xml返回给客户端,让客户端的代码(javascript)来格式化,继而显示(所谓的more client side logic, less server side logic)

当然上面只是一个简单的例子, 可以推广到各种ajax的动态请求场景.

从用户的角度来看,二者的结果是一致的,但是程序员在处理时却是截然不同的. 所以出现了下面的几个问题:
  1. 我们应该优先选择哪种?
  2. 哪种有更好的performance?
  3. 哪种更user-friendly?
这个问题, 我同时也在SO上进行了讨论,大家可以参见这里: http://stackoverflow.com/questions/1516852/client-side-logic-or-server-side-logic

从回答的答案来看, 也没有取得一个统一的结果,主要有下面几个观点
支持服务器端逻辑:
  1. 安全性
  2. 搜索引擎友好
  3. 有更好的accessibility
  4. 更好的适应性(无论用户使用的是支持js或者不支持的)
  5. 用户体验的稳定性(由于不知道用户使用的是什么浏览器,也就不能确定js引擎的解析速度,所以可能某些浏览器用户会觉得很友好,而某些会觉得很慢,而使用服务器端则取决于网络)
  6. 硬件成本的降低(这也是可预期的)
客户端的逻辑:
  1. 用户友好(不需要refresh,而且通常会有更好的异步处理,所谓的ajax)
  2. 节省带宽,减少成本(当然传输pure data的json肯定会比格式化好的html节省更多的带宽)
  3. 扩展性(这点可能比较有争议,但是保持服务器端逻辑的简洁对于扩展性还是很有帮助的)
  4. 现代浏览器的发展(IE,FF, chrome相继宣称自己有更快的js引擎,所以js的解析速度会有大幅度的提升,而且使用老浏览器的用户也是极少的)
好像是各有道理,那么可能更好的办法是both,于是一个新问题就出来了: 在何种场景下使用何种策略? 在可预期的未来, 哪种方式更要优先考虑呢?

我个人的见解是除了下面几种情况外,我都会优先使用客户端的逻辑:
  1. 安全性(如一些验证, 也就是状态更改相关的)
  2. 特殊人群(可能某些人群具有特殊的属性,如果我们的服务是针对这些人的,可能就要好好权衡)
希望有经验的朋友能够给出一些比较有说服力并且可操作的方法来(比如应用场景),也请解释下相应的原因.

谢谢.

--
Tower Joo 朱涛

>>> import this

朱涛 Tower Joo

unread,
Oct 5, 2009, 1:26:23 AM10/5/09
to pyth...@googlegroups.com
写了一篇关于这个话题的博文, 大家可以参考.

--
Tower Joo 朱涛

>>> import this



2009/10/5 朱涛 Tower Joo <zhutao...@gmail.com>

Terry

unread,
Oct 5, 2009, 1:33:21 AM10/5/09
to pyth...@googlegroups.com
这个问题有点意思,我简单谈谈我的看法。

其实RESTful的架构设计从某一方面来说,也是要解决这样一个问题。

比如,同一个controller很有可能被多种客户端所请求,也同时需要作出不同的响应,比如html,json,xml等等。

我认为controller应该在不同类型请求中保持一致。至于说是不是单纯就直接从数据库拿数据,我觉得是值得商榷的。

但是这样做必然造成一个结果,各种客户端的需求可能是不同的。很有可能某种客户端通过这一次请求是不能完全拿到想要的数据。

矛盾就此产生,是单独再写一个controller返回某种客户端需要的所有数据,还是让客户端发起多次请求来拿到所有他需要的数据。

我倾向于后者, 这样保持后端架构的整洁性和可扩展性。

但是这样做也势必会把一些业务逻辑交给前端(我认为这是一种趋势),同样多次请求也必然会有一定的性能损失。

这是一种选择。只是我更喜欢后者。 :)

2009/10/5 朱涛 Tower Joo <zhutao...@gmail.com>:

Jerry

unread,
Oct 5, 2009, 3:19:00 AM10/5/09
to python-cn`CPyUG`华蟒用户组(中文Py用户组)
My SO answer --

http://stackoverflow.com/questions/1516852/client-side-logic-or-server-side-logic/1518641#1518641

Jerry

On Oct 5, 10:40 am, 朱涛 Tower Joo <zhutao.is...@gmail.com> wrote:
> 大家好!
> 在做过几个基于web的项目后, 碰到了一个比较难把握的问题: *在实现同一个功能时, 我们应该选择服务器端逻辑还是客户端的逻辑?*
> *
> *
> *举个简单的例子:*
> *功能: 我现在想动态地显示一个页面*
> *方案1: 服务器端的逻辑: 从数据库里取出数据使用服务器端代码(PHP,python)来生成格式化后的页面,返回给客户端,
> 然后客户端直接显示.(所谓的more server side logic, less client side logic)*
> *方案2: 客户端的逻辑: 从数据库里直接取出数据,
> 并不格式化,而是以json或者xml返回给客户端,让客户端的代码(javascript)来格式化,继而显示(所谓的more client side
> logic, less server side logic)*
> *
> *
> *当然上面只是一个简单的例子, 可以推广到各种ajax的动态请求场景.*
> *
> *
> *从用户的角度来看,二者的结果是一致的,但是程序员在处理时却是截然不同的. 所以出现了下面的几个问题:*
>
> 1. 我们应该优先选择哪种?
> 2. 哪种有更好的performance?
> 3. 哪种更user-friendly?
>
> 这个问题, 我同时也在SO上进行了讨论,大家可以参见这里:http://stackoverflow.com/questions/1516852/client-side-logic-or-serve...
>
> 从回答的答案来看, 也没有取得一个统一的结果,主要有下面几个观点
> 支持服务器端逻辑:
>
> 1. 安全性
> 2. 搜索引擎友好
> 3. 有更好的accessibility
> 4. 更好的适应性(无论用户使用的是支持js或者不支持的)
> 5.
> 用户体验的稳定性(由于不知道用户使用的是什么浏览器,也就不能确定js引擎的解析速度,所以可能某些浏览器用户会觉得很友好,而某些会觉得很慢,而使用服务器端则取决于网络)
> 6. 硬件成本的降低(这也是可预期的)
>
> 客户端的逻辑:
>
> 1. 用户友好(不需要refresh,而且通常会有更好的异步处理,所谓的ajax)
> 2. 节省带宽,减少成本(当然传输pure data的json肯定会比格式化好的html节省更多的带宽)
> 3. 扩展性(这点可能比较有争议,但是保持服务器端逻辑的简洁对于扩展性还是很有帮助的)
> 4. 现代浏览器的发展(IE,FF,
> chrome相继宣称自己有更快的js引擎,所以js的解析速度会有大幅度的提升,而且使用老浏览器的用户也是极少的)
>
> 好像是各有道理,那么可能更好的办法是both,于是一个新问题就出来了: *在何种场景下使用何种策略? 在可预期的未来, 哪种方式更要优先考虑呢?*
>
> 我个人的见解是除了下面几种情况外,我都会优先使用客户端的逻辑:
>
> 1. 安全性(如一些验证, 也就是状态更改相关的)
> 2. 特殊人群(可能某些人群具有特殊的属性,如果我们的服务是针对这些人的,可能就要好好权衡)
>
> 希望有经验的朋友能够给出一些比较有说服力并且可操作的方法来(比如应用场景),也请解释下相应的原因.
>
> 谢谢.
> *
> *--

四不象

unread,
Oct 5, 2009, 7:23:53 AM10/5/09
to pyth...@googlegroups.com
可以借鉴SOA的思想,把系统切割成一个个REST服务,把M和C分布到服务中去,可以在服务器端生成HTML形式的View,或者在客户端通过Ajax、JSON等技术生成View

2009/10/5 Terry <posh...@gmail.com>



--
水仙欲上鲤鱼去
一夜芙蓉红泪多

victor lee

unread,
Oct 5, 2009, 11:14:51 AM10/5/09
to pyth...@googlegroups.com
服务器,你把握不了你的用户。

Chen GUO

unread,
Oct 7, 2009, 1:58:13 AM10/7/09
to pyth...@googlegroups.com
这个问题不该有答案,就好像我问你,做菜到底是该咸一点让客户自己加水呢,还是该淡一点让客户自己加盐

On 10/5/09, victor lee <victor...@gmail.com> wrote:
> 服务器,你把握不了你的用户。
>
> 2009/10/5 四不象 <tabri...@gmail.com>

Xiao

unread,
Oct 8, 2009, 9:00:30 AM10/8/09
to pyth...@googlegroups.com
如果服务器承受得了,比如云端或者cluster,可以放服务器端。
如果客户端安全不受影响,可以放客户端。放客户端需要考虑分布式逻辑如何在网络上传输。

2009/10/7 Chen GUO <gcd...@gmail.com>:

Chris Chen

unread,
Oct 8, 2009, 11:21:50 AM10/8/09
to pyth...@googlegroups.com
我倾向于第一种方法,除非返回的结果非常简单才会用json或xml返回

如果内容比较多,像文章列表之类的,我会用第一种方式组织好html代码直接返回

纯ajax界面除外

2009/10/8 Xiao <dah...@gmail.com>



--
Chris

zhaowei

unread,
Oct 9, 2009, 1:06:51 AM10/9/09
to pyth...@googlegroups.com
如果大量使用了json这种方式在客户端呈现数据。
从搜索引擎友好这点来说是不是不够好?
搜索引擎也很重要

2009/10/8 Chris Chen <cdc...@gmail.com>
Reply all
Reply to author
Forward
0 new messages