首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

请问大型WEB系统的架构设计和技术选型

2012-10-25 
请教大型WEB系统的架构设计和技术选型目前系统架构如下:1.web层采用struts+tomcat实现,整个系统采用20多台

请教大型WEB系统的架构设计和技术选型
目前系统架构如下:
  1.web层采用struts+tomcat实现,整个系统采用20多台web服务器,其负载均衡采用硬件F5来实现;
  2.中间层采用无状态会话Bean+DAO+helper类来实现,共3台weblogic服务器,部署有多个EJB,其负载均衡也采用F5来实现;
  3.数据库层的操作是自己写的通用类实现的,两台ORACLE数据库服务器,分别存放用户信息和业务数据;一台SQL SERVER数据库,是第三方的业务数据信息;
  web层调用EJB远程接口来访问中间件层.web层首先通过一个XML配置文件中配置的EJB接口信息来调用相应的EJB远程接口;
  该系统中一次操作涉及到两个ORACLE库以及一个SQL SERVER库的访问和操作,即有三个数据库连接,在一个事务中完成.

  以上的描述不知道是不是足够清楚,目前想采用业界流行的一些框架来重新架构整个系统,请各位高手分析一下,这样的系统能不能采用struts+spring+hibernate框架来实现,如果可以的话,其中的多个数据库的连接、事务控制、负载均衡都如何实现,或者有其他更好的技术来架构系统?谢谢! 77 楼 binggun521 2007-09-12   晕..都是大牛....新手报到
讨论的很精彩..新手有点发现新大陆的感觉... 78 楼 mfc42d 2007-09-14   我做了6年的网站开发,没有见过那个网站使用tomcat的,5460 和最初的书生网是,sina sohu 263 163用的全是resin  也就是政府网站使用较多weblogic ,主要是OA
java的并发
http://blogger.org.cn/blog/more.asp?name=hongrui&id=25175

http://blogger.org.cn/blog/more.asp?name=hongrui&id=23973
从实际应用的角度来说。-Xmx大了不是很好,垃圾回收需要更多的时间,但是thread问题就很大,配给JVM的内存数越大,tomcat所能开的thread数就越小,最后出现ava.lang.OutOfMemoryError: unable to create new native thread。根据我在windows下编程经验,windows起的线程栈的大小写在可执行文件头,默认是1M。对于java来说,如果采用默认xss设置,jdk1.4每线程256k, jdk1.5每线程1M。如果设置没有超过1M, 又不是默认设置,那么jdk就会为每个线程分配1M。
对于windows来说,32位使用最大内存为2G,如果你给jvm分1.5G,剩余大约500M,供OS使用,其中windows的dll占了一部分,但是你在JVM创建线程的时候,创建的是OS的线程,他要从剩余的空间中分配内存。如果没有可用内存,出现上述错误。
参看hotspot\src\share\vm\runtime\os.c
{ MutexLocker mu(Threads_lock);
      JavaThread* signal_thread = new JavaThread(&signal_thread_entry);
                                                                                                                             
      // At this point it may be possible that no osthread was created for the
      // JavaThread due to lack of memory. We would have to throw an exception
      // in that case. However, since this must work and we do not allow
      // exceptions anyway, check and abort if this fails.
      if (signal_thread == NULL || signal_thread->osthread() == NULL) {
        vm_exit_during_initialization("java.lang.OutOfMemoryError",
                                      "unable to create new native thread");
      }
公式如下
(MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads
解决的办法就是减少-Xmx的数量,减少xss的值,或者开启3GB模式。

最主要的还是程序员的编程,对于网络编程,在nio出来之前,每一个线程只能处理一个socket请求,也就是说一个socket连接需要一个线程,这样使服务器的并发收到了限制,压力不能过大,因为服务器开启thread有限,这造成了tomcat的性能远不如apache。nio出来之后,在一个线程内处理几个连接成为了可能,几乎所有的java的开源web服务器,tomcat6,jetty,resin都用nio重写了网络连接部分,不开源的apusic也用了nio。

79 楼 webmaker 2007-09-18   楼主的资源似乎很充足嘛,汗一把 ,这是一个啥样子的项目啊:o 80 楼 davexin 2007-09-22   mfc42d 写道我做了6年的网站开发,没有见过那个网站使用tomcat的,5460 和最初的书生网是,sina sohu 263 163用的全是resin  也就是政府网站使用较多weblogic ,主要是OA
java的并发
http://blogger.org.cn/blog/more.asp?name=hongrui&id=25175

http://blogger.org.cn/blog/more.asp?name=hongrui&id=23973
从实际应用的角度来说。-Xmx大了不是很好,垃圾回收需要更多的时间,但是thread问题就很大,配给JVM的内存数越大,tomcat所能开的thread数就越小,最后出现ava.lang.OutOfMemoryError: unable to create new native thread。根据我在windows下编程经验,windows起的线程栈的大小写在可执行文件头,默认是1M。对于java来说,如果采用默认xss设置,jdk1.4每线程256k, jdk1.5每线程1M。如果设置没有超过1M, 又不是默认设置,那么jdk就会为每个线程分配1M。
对于windows来说,32位使用最大内存为2G,如果你给jvm分1.5G,剩余大约500M,供OS使用,其中windows的dll占了一部分,但是你在JVM创建线程的时候,创建的是OS的线程,他要从剩余的空间中分配内存。如果没有可用内存,出现上述错误。
参看hotspot\src\share\vm\runtime\os.c
{ MutexLocker mu(Threads_lock);
      JavaThread* signal_thread = new JavaThread(&signal_thread_entry);
                                                                                                                             
      // At this point it may be possible that no osthread was created for the
      // JavaThread due to lack of memory. We would have to throw an exception
      // in that case. However, since this must work and we do not allow
      // exceptions anyway, check and abort if this fails.
      if (signal_thread == NULL || signal_thread->osthread() == NULL) {
        vm_exit_during_initialization("java.lang.OutOfMemoryError",
                                      "unable to create new native thread");
      }
公式如下
(MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads
解决的办法就是减少-Xmx的数量,减少xss的值,或者开启3GB模式。

最主要的还是程序员的编程,对于网络编程,在nio出来之前,每一个线程只能处理一个socket请求,也就是说一个socket连接需要一个线程,这样使服务器的并发收到了限制,压力不能过大,因为服务器开启thread有限,这造成了tomcat的性能远不如apache。nio出来之后,在一个线程内处理几个连接成为了可能,几乎所有的java的开源web服务器,tomcat6,jetty,resin都用nio重写了网络连接部分,不开源的apusic也用了nio。


对于tomcat和apache的使用,我觉得要结合起来用apache用过静态页面处理,tomcat用作动态页面处理,如果不用tomcat,用resin 性能也不能提高多少,已经做过tomcat6的性能测试,在32位操作系统下,他的性能还不如tomcat4.1(交易量和响应时间),但在64位操作系统下,tomcat6比tomcat4.1的性能有所提高(交易量增加响应时间变短),但是当用户并发超过600时,响应时间超过了10秒,对我们系统来说已经没有意义。也不是说用了nio就可以提高多少性能,在jdk1.5以后,在64位操作系统上,jdk已经没有最大内存的限制,经过测试,当内存用的比较大的时候,当用到交换分区的时候(linux系统),虚拟机会进行内存回收,此时机器压力是比较大的,整个机器基本上是不再响应请求。这一点我觉得你说得还是非常有道理的。但是个人觉得,resin的性能也不会比tomcat强多少的。如果谁有测试数据,请贴出来交流一下。 81 楼 xinlnix 2007-09-26   佩服,佩服,楼上各位的高论,让本人大长见识。这里我有几个问题讨教一下:

为何JEE用于金融、电信、银行等行业比用于网站更多呢?难道这些行业比互联网企业对性能要求低?
近来,JEE 5.0有了很大改进,是否能够改变这种局面,也能用于互联网大并发访问的情况呢?
交易类网站,如淘宝,也需要大量事务,它到底与金融、电信、银行等行业的事务有何区别,它不能应用JEE 5.0吗?

请各位帮忙解释一下,谢谢。 82 楼 chinata 2007-10-01   mark先,有点问题要细看一下这个thread 83 楼 aniken 2008-03-30   可以很负责的说,4G内存至强单核双路的服务器,安装apache2 + 2个tomcat5实例,做好动态缓存,对于一般的网站应用,并发1500个好不困难.局域网测试并发2000个平均响应时间都在3秒以下。

大家根本不用怀疑tomcat的性能,我认识的好几个硅谷海龟创业,都用的apache+tomcat+oracle,如yeeyoo.com等。 84 楼 swordrawn 2008-04-07   现在用ejb,不都是用无状态的session bean做门面吗 85 楼 LucasLee 2008-04-07   8000 写道对于你你们舍得投入巨资买weblogic,买oracle,买几十台HP OR ibm服务器的项目,最好的办法是拨打范凯先生的电话,告诉他们你们需要咨询,几个月后你总共加起来买2台服务器就可以搞定。

这可能是最最捷径的办法,真的!
这个...虽有广告嫌疑,但的确同意。
找BEA的人来搞测试是有失公允的。
找第三方的人来搞还差不多。
性价比还高呢 86 楼 LucasLee 2008-04-07   用LoadRunner只支持1000并发。。。
你还不如用开源的OpenSTA,这东西支持CORBA,可以多台客户机一起跑一个压力测试,估计就没有什么用户限制了。
当然我还从没用过这么大并发的测试,也就没有跑过一台以上的客户机测试。 87 楼 davexin 2008-04-07   如果没有做过 这样 的 项目,我想你们 不会理解 为什么 要这样 做,如果 没有经历过几十台机器几分钟 内 就全部 不能 服务,我想你们 也不会了解 我们 为什么这样做了 。 dao层和 web层还有业务层 分开 的原因 ,一方面是因为 方便 维护 ,减少代码 的 修改,另一方面有安全的 原因,说一个大家 可能 知道 但是可能 也不知道 的 重要原因 吧,dao层 是放在 内网 的 ,web层放在 公网的 ,这是安全,另外就是 在内网的 dao层 就是 数据库层 ,如 oracle rac(oracle集群,可能 大家 都没用过 ,但我们在使用),还有ejb的 集群 ,其中 有loadblance的问题和 线程安全的 问题,最重要 还有licence的 问题(这也是 很重要的 ),,如果 (这也是我们使用 ejb集群的 原因,因为很难做出不使用 ejb做 群集 而又保证安全和 扩展性的 架构,因为这样可以随意 向ejb集群中增加机器,提高并发和性能),到现在本人没有发现比这个 更好的方案。如果大家有,可以交流 一下 。至于 让 spring控制事物,我们根本 不敢用 的 ,性能太差 ,hibernate也不敢用 ,没办法 保证性能 。我们的每个 sql语句都很关键的 ,举个简单 例子 ,我们的数据库 没必要 的 话是不让 更新 的 ,只能 insert记录,因为这样 的 速度更快。总之 ,有很多原因和 经验,因为做了才知道的 。不过 我们的 这种方式可能 大部分的 项目是 用不倒的。因为我们 的 行业很特殊。 88 楼 fori 2008-04-08   连针对什么项目都不说,谈什么架构,架构是根据所处的环境、业务、旧有系统间的整合来综合考虑的,不是最流行的就是最好的。有人说为什么要用ejb,你用过ejb吗?知道ejb能解决多少事情吗?ejb是侵入性比较强(实现它必须要和代码结合的很紧密,很难拆分开),但是它确实是很好的解决方案。比如事务的控制,远程服务的提供等等。只是说它确实做得太大了,什么都想占全,所以导致没法收手了。可是它确实是个优秀的解决方案。hibernate针对大型系统,特别对数据库依赖性很强的系统,说实话不是很适合,例如电信。见过用的,后来因为性能问题推翻改用手写sql。针对复杂业务的系统最好少用hibernate。当然如果有高手可以用,可是你能保证100人的大型项目团队都是高手?那要多大的代价啊!!所以框架在优秀也要考虑开发成本!所以框架的选用要考虑到项目的状况、成本和后期的扩展。好像说了一堆废话,没涉及具体的技术,只是从架构设计的方面给点建议。 89 楼 kenees 2008-04-08   EJB2.X如果只用session bean(state less)和MDB的话,除了难写点没有所谓的说的那么不好,不要太过个人崇拜,用过了再发表意见,现在觉得社区里面对EJB的态度感觉就像对瘟神...呵呵,另外从EJB3.X开始,它的编写也是相当方便了,没有必要一定非SPRING不可,感觉没有SPRING就觉得落伍... 90 楼 davexin 2008-04-19   总算有了认识ejb真正威力的人,我们已经使用ejb3.0开发升级项目了,项目已经完成 ,总的说来还算不错,唯一不爽的地方,ejb3的 注解不通用,jboss和weblogic就不同,不过既然用了ejb,我想都是比较大 的 商业项目,也不会在考虑jboss了。 91 楼 javaeye26b 2008-06-02   power2 写道  对于楼主的问题,以及公司的架构方案,我认为你们仍然在犯错!
  误区:遇到性能问题的第一件事情就是找硬件和容器的事情!
  性能问题的基本上无一例外的都出在写的程序有问题,满足不了伸缩性。
  好好看看你们的程序吧,不要再给bea打电话了,你得到的建议,基本上都是用不到的。
  robin的观点是对的,我甚至怀疑你们的数据库连接是否有释放问题的。
  增加你们前端的内存,多做缓存。hibernate的cache方案不差jdbc对数据库的频繁使用
  html的书写是否符合w3的规范
 
  最好在一个服务器上部署整个应用!

程序有问题,是开发部的问题。我们做软件的不但得不到任何好处,还得挨批评(搞不好老板会换人);
硬件和容器有问题,是别人的问题。不但做软件的没有问题,还可以顺便捞点好处(搞不好老板还是会换人)。

所以,关键是看老板是哪一种人。蒙得了,就说容器有问题了;蒙不了,当然只能“我改”了。 92 楼 xidaboy 2008-07-08  
davexin:

讨论EJB没什么意思,还不如说你花了钱,WEBLOGIC帮你做了些什么。。。。。


讨论来讨论去,简直是TOMCAT PK WEBLOGIC

期待楼主提供一份JBOSS和WEBLOGIC的对比测试报告


:)
93 楼 icewubin 2008-07-09   davexin 写道如果 (这也是我们使用 ejb集群的 原因,因为很难做出不使用 ejb做 群集 而又保证安全和 扩展性的 架构,因为这样可以随意 向ejb集群中增加机器,提高并发和性能),到现在本人没有发现比这个 更好的方案。如果大家有,可以交流 一下 。至于 让 spring控制事物,我们根本 不敢用 的 ,性能太差

ejb集群中增加机器,能提高并发和性能是BEA的人告诉你的吧,不知道你们的采购合同中有没有说明,每增加一台机器,性能指标能提高多少?

强烈建议楼主看一遍《J2EE WITHOUT EJB》,不是要你推翻现在的架构,而是你的想法中有些结论是别人灌输的,属于想当然。

spring事务控制性能太差,请举出例子。

再提一句,利用反向代理。一样可以让tomcat放在内网中的。

还有请马上测试tomcat APR打开的情况。


94 楼 cyz 2008-08-16   rtdb 写道> 大型WEB系统

没有用户量,数据量等基本信息,谈什么架构设计和技术选型 ?


没有用户量,数据量,应用领域谈什么技术选型啊?

还有,大型WEB应用居然敢用EJB?OH,NO!
95 楼 xuwen21 2008-08-16   stuts、hibernate、spring不是架构,而是框架。这个框架主要用于大型项目,开发周期比较长。首先你的系统在硬件方面和数据库的使用方面来看的确算大型系统,但你的业务主要做些操作呢。如果你的业务经常进行数据库操作可以使用hibernate,否则反而会影响系统性能。至于你所说的三个数据库连接,你可以先将它们的连接信息写在连接池的配置文件中,然后,考虑连接池 在什么时候使用那个连接。具体的实现查一下hibernate连接池的相关资料吧。 96 楼 sunzhyng 2008-08-27   lz说的大型是基于那么多服务器和昂贵的设备,而并不是业务吧。

热点排行