论坛首页 Java企业应用论坛

关于系统性能的思考

浏览 27312 次
精华帖 (12) :: 良好帖 (3) :: 新手帖 (7) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-04-27  
fjlyxx 写道
人讲究性能,机器也讲究性能.人和机器一样,性能无非就受两点影响1.先天因素 2.后天培养
先天因素我们无法改变,人就长成那样了或者机器就那个配置了,这种情况没啥办法.
后天培养倒是可以提高一点性能,但是提高的有限度.就好比你没有办法让手机跑ORACLE一样,
架构和性能绝对是唱反调的.人为了道德要穿衣服,但是穿上了越好的衣服性能也就受越大的影响(最起码时间上没有不穿的快).

技术可以提高性能,池话,负载均衡,分布式都可以提高性能,但是这些都有瓶颈.这就好比人的药物治疗,不治本.

业务设计才是提高性能的王道.业务是一个系统的灵魂,就好比是人类的DNA.改造DNA 进行业务的深度分析才能从根本上提高性能.

严重认同此观点。
0 请登录后投票
   发表时间:2009-04-27  
shuai45 写道
狂放不羁 写道
shuai45 写道
“我觉得全局application缓存会比较好,session中尽量少保存数据。”
目前有很多缓存框架。OSCACHE就非常不错。我没做过大项目,基本都是数据库能解决的就用数据库。
实在解决不了 或者性能存在一些问题 就通过程序 上解决。不过这样做 并不好,完全的被动。所以 一个项目要从设计上就考虑优化,而且可扩展。
这样的经验 实在太少。希望LZ把你的开发经验分享一下。


对于如何设计一个扩展的业务对象模型,我目前也处于探索中,但是我敢肯定的就是设计对象模型是一定要划分出一个边界,然后设计为一个聚合,这样整个对象模型由不同的聚合来构成,并且访问聚合内部的对象都要通过聚合根来控制。这样提供一个全局的访问控制点,便于维护和管理。并且我们设计聚合的时候,一定要区分出根对象中哪些属性是经常变化的,哪些不是经常变化,这样我们可以把经常变化的属性独立出来,作为一个值对象。这样通过对对象的细粒度的设计,我们可以更容易控制我们的缓存。所以我觉得对象生命周期很重要,这就设计到了DDD中的工厂和仓库两个模式,我目前的设计中,我是通过工厂来控制对象生命周期的起始,并且保证对象创建出来的聚合根式满足系统不变量的约束的,那么对象创建以后,其它的生命周期交给仓库管理。仓库(repository)管理对象创建以后的生命周期,我觉得这个时候就要使用缓存来管理了,我们要想得到领域对象,只能从一个地方来获得,那就是仓库,而仓库首先通过一个全局的缓存中去获得对象,如果缓存中没有就从数据库或者其它持久性数据源得到对象,然后放到缓存中,这样系统中的所有对对象的访问,都需要经过统一的地方:仓库。当系统中发生了引起领域对象状态变化的操作以后,我们可以清空缓存中的对象或者只清空领域对象的一部分,比如分离出来的状态。

最后使用全局的缓冲还有一个好处,那就是集群环境下面,因为我们可以把全局缓冲通过一个分布式的缓冲透明的替换,这样减少了不同节点之间同步session,以及session failover的开销,这其实就有点SNA的味道了。呵呵。



不知道您有没有读过:<<领域驱动设计>>这本书,这本书我觉得非常好,如果没看过,推荐您看看。这里面详细简介了如何开发一个针对于自己当前业务状态的对象模型。

听楼主的意思,我感觉是 设计模式+CHCHE的组合呢。就是把缓存的意思设定在设计模式的基础上。如果这样的话,缓存的意思感觉存在性不大。重点的是项目的整个设计。看来还是以设计为主。可扩展、高性能在是主要,至于技术实现 是次要。



我的意思不是您说的“设计模式+cache”,cache缓存什么东西才有意义呢?那其实就是针对不同的系统的业务对象模型,而要想能在并发环境下容易控制业务对象模型,那么业务对象的设计,封装时非常重要的,这个时候聚合的作用性就很重要。所以要想能发挥真正缓存的效力,一个优良的系统业务对象模型是非常重要。
0 请登录后投票
   发表时间:2009-04-27  
有没有成型的设计作品或思路。发表一下,我借鉴一下。
0 请登录后投票
   发表时间:2009-04-27  
引用
第一:池化系统的功能性组件
    在每个系统中,我想都会存在功能性的组件,比如当前开发当中的service,这些功能性的服务一般来说都是没有状态的,是可以多用户共享的,这种共享的服务对象,我们也需要将其进行统一的管理,幸运的是目前已经存在很多这样的管理功能性服务的框架或者容器,比如目前比较流行的各种IOC容器,或者是重量级的EJB容器,它们都提供了对系统中各种服务组件的管理。


我的理解是,为了提高对象的重复利用,对于有状态的对象是可以放到池里的。比如线程池中的线程,线程是忙还是空闲,这就是线程的状态,连接池中的连接也一样。你上面提到的service,就像你说的,他是无状态的。那么他就应该做成一个单例。就像你说的,会用到IOC。这里,我只是觉得你的描述与“池化系统的功能性组件”不太符合。

10 请登录后投票
   发表时间:2009-04-27   最后修改:2009-04-27
liujunsong 写道
要提高性能,最关键的是客户端和服务器的合理分工.
现在啥事情都扔给App服务器去干,最后不慢才怪.
把界面方面的事情扔给客户端,后台只提供数据服务,自然性能就高了.
光限制在服务器上折腾,是不能从根本上解决问题的..


说的很对。但有的时候,啥功能做在服务端,啥功能做在客户端,是有很多因素在里面的。不是单纯从技术的角度出发可以决定的。更不是我们说了算的。深受其害中
0 请登录后投票
   发表时间:2009-04-27  
puroc 写道
引用
第一:池化系统的功能性组件
    在每个系统中,我想都会存在功能性的组件,比如当前开发当中的service,这些功能性的服务一般来说都是没有状态的,是可以多用户共享的,这种共享的服务对象,我们也需要将其进行统一的管理,幸运的是目前已经存在很多这样的管理功能性服务的框架或者容器,比如目前比较流行的各种IOC容器,或者是重量级的EJB容器,它们都提供了对系统中各种服务组件的管理。


我的理解是,为了提高对象的重复利用,对于有状态的对象是可以放到池里的。比如线程池中的线程,线程是忙还是空闲,这就是线程的状态,连接池中的连接也一样。你上面提到的service,就像你说的,他是无状态的。那么他就应该做成一个单例。就像你说的,会用到IOC。这里,我只是觉得你的描述与“池化系统的功能性组件”不太符合。



呵呵,谢谢。我这里是普通意义的池,EJB stateless session bean就是池化管理,而对于轻量级容器的单例实例,我可以理解为只有一个实例的池,总之是为了重用。我觉得有状态的对象是不需要放到池里的,有状态的对象是没有办法重用的,没有办法重用的东西放到池里没什么意义。有状态的组件比如ejb的statefull session bean采用钝化和激活的方式来管理。或者也可以采用session来hold。
0 请登录后投票
   发表时间:2009-04-27  
shuai45 写道
有没有成型的设计作品或思路。发表一下,我借鉴一下。



其实设计思路,我觉得采用DDD那本书上说的就不错,可惜呢?国内很少用啊,就包括我现在公司的建行项目组也都是用的传统的开发方式,毕竟大环境没办法改变,下午还要去参加建行项目的培训,就先写到这里。
0 请登录后投票
   发表时间:2009-04-27  
SNA架构 是什么呀 还真不知道
0 请登录后投票
   发表时间:2009-04-28  
fjlyxx 写道
人讲究性能,机器也讲究性能.人和机器一样,性能无非就受两点影响1.先天因素 2.后天培养
先天因素我们无法改变,人就长成那样了或者机器就那个配置了,这种情况没啥办法.
后天培养倒是可以提高一点性能,但是提高的有限度.就好比你没有办法让手机跑ORACLE一样,
架构和性能绝对是唱反调的.人为了道德要穿衣服,但是穿上了越好的衣服性能也就受越大的影响(最起码时间上没有不穿的快).

技术可以提高性能,池话,负载均衡,分布式都可以提高性能,但是这些都有瓶颈.这就好比人的药物治疗,不治本.

业务设计才是提高性能的王道.业务是一个系统的灵魂,就好比是人类的DNA.改造DNA 进行业务的深度分析才能从根本上提高性能.


说得很对呀
0 请登录后投票
   发表时间:2009-04-28  
fjlyxx 写道
人讲究性能,机器也讲究性能.人和机器一样,性能无非就受两点影响1.先天因素 2.后天培养
先天因素我们无法改变,人就长成那样了或者机器就那个配置了,这种情况没啥办法.
后天培养倒是可以提高一点性能,但是提高的有限度.就好比你没有办法让手机跑ORACLE一样,
架构和性能绝对是唱反调的.人为了道德要穿衣服,但是穿上了越好的衣服性能也就受越大的影响(最起码时间上没有不穿的快).

技术可以提高性能,池话,负载均衡,分布式都可以提高性能,但是这些都有瓶颈.这就好比人的药物治疗,不治本.

业务设计才是提高性能的王道.业务是一个系统的灵魂,就好比是人类的DNA.改造DNA 进行业务的深度分析才能从根本上提高性能.


有道理,业务设计才是软件的灵魂,严重同意。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics