Topic: jsp or servlet中的两个教训 |
Print this page |
1.jsp or servlet中的两个教训 | Copy to clipboard |
Posted by: emarket Posted on: 2003-03-09 17:50 从一个失败的project中来的教训, 1. 不要在 jsp or servlet中轻易开线程(尤其在流量大的情况下)。 2. 在流量大的情况下,不要使用runtime.exec()开进程。 (笔者原文发表在ustc bbs上) 这两天,我一直被别人写的一个程序困扰,(这是一个设计缺陷,不是一个软件bug, 所以我们失败了) 先说说我遇到的情况吧: 一个servelt 创建一个objectA, 然后调用objectA.method()去做些事 这个objectA.method()会开N个(N由用户指定)线程,这N个每个线程会开 一个进程(Runtime.Exec())调用一段perl的程序,然后从inputstream中读出 结果分析,然后显示在jsp页面上。 这是一个典型的anti-pattern得设计,为此 我们可能已经失去了客户,公司的管理层正在和他们谈判:)。 先说说我们的问题吧,由于一个用户可以fire N个线程,所以一个用户的一个 request就变成的N个等效的request。 所以从log文件中得到的用户数量并不大, 但实际上是要乘以N的。而且n可以由用户指定(有个最大值N),于是,在用户数量并不大的情况下,系统 资源就会被耗尽而且出现的很多所谓的僵尸进程(因为process通信的问题)。 下面是我做的分析 1. servlet或jsp中搞多线程 虽然多线程模型可以提高效率,但也要具体情况具体分析,如果你只有一个cpu 而你开了很多线程去读文件(或类似的serialation操作)对你性能不会有什么显著的 提高。而且在servlet和jsp中开多线程一定要注意,不要万不得已,千万别这么做, 因为你要保证24*7的性能,就必须是container可控,像这样在servlet中开线程是不可控 的。而且也要考虑到多线程是否对你有所帮助,例如我有一个cpu,10个文件,我开了10个 线程去读那10个文件,和一个线程读10次,性能应该是差不多的。 教训:不要在servelet或者,jsp中玩多线程。因为他们本身已经是多线成的了,而且很难 控制。例如你有一个jsp要显示10个文件的内容,你开了10个线程去读。不如写一个jsp读 一个文件,然后再另一个jsp中<jsp:include>那个文件10次。多线程不是在所有地方都有 效率的。另外可以考虑一下EJB的模型,毕竟他是container可控的对象。 2. 在server端开process去执行另外一个程序例如perl. 有人认为Runtime.exec()和Process是java的一个缺陷[1] 虽然[1]可以在一定程度上解决我们的问题,但是在大流量 的server端,没法保证inputstream不over flow, 也没法保证在子process退出 之前,server就一定可以把数据读完(流量很大的情况),不要相信java 的waitfor或者是destroy。于是就会出现所谓 的僵尸进程,或者死掉的java线程。 教训:在server端尽量不要搞java和其他语言通信的东西 如果非通不可,应该考虑是否可以用corba或者JCA(manageable)来稿, 在server端应该尽量避免使用runtime.exec()去开进程(尤其在大流量的时候) 如果实在要使用,可以考虑里提到的jconfig[2], 毕竟java 的process对象太弱了。如果是牛人可以考虑实现自己的native process和java 通信。 这是一个失败的教训,或许对大家有用,以后别这样设计.尤其是legacy system. j2ee提供了很好的模型,例如EJB, JCA。 不要自己咕哝一套模型。 欢迎讨论你的教训:) 参考文献: 1。(http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html) 2。(http://www.tolstoy.com/samizdat/jconfig.html) |
2.Re:jsp or servlet中的两个教训 [Re: emarket] | Copy to clipboard |
Posted by: dapan Posted on: 2003-03-10 10:26 不错的! 多谢共享! ^_^ |
3.Re:jsp or servlet中的两个教训 [Re: emarket] | Copy to clipboard |
Posted by: SimonLei Posted on: 2003-03-10 12:16 呵呵,灌到这儿来了。 欢迎。 |
4.Re:jsp or servlet中的两个教训 [Re: SimonLei] | Copy to clipboard |
Posted by: emarket Posted on: 2003-03-10 13:18 为了挣分,下东西,//hehe :) |
5.Re:jsp or servlet中的两个教训 [Re: emarket] | Copy to clipboard |
Posted by: yahoo163 Posted on: 2003-03-15 15:39 你说的有一定道理,不过我觉得如果使用EJB或JCA模型的话要看使用的场所,它并不是一应万灵的东西,毕竟EJB是一个重量级组件(尤其是实体BEAN) |
6.Re:jsp or servlet中的两个教训 [Re: emarket] | Copy to clipboard |
Posted by: emarket Posted on: 2003-03-15 18:15 //hehe 那两个教训就是在load很大的时候出现的。 当然,是在设计的时候,因为一味的追求速度,而忽视了 ”重量“ |
7.Re:jsp or servlet中的两个教训 [Re: emarket] | Copy to clipboard |
Posted by: kangyd Posted on: 2003-03-17 20:31 good |
8.Re:jsp or servlet中的两个教训 [Re: emarket] | Copy to clipboard |
Posted by: xs21cn Posted on: 2003-03-17 21:40 属于低级错误,没什么价值。 |
Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1 客服电话 18559299278 客服信箱 714923@qq.com 客服QQ 714923 |