??xml version="1.0" encoding="utf-8" standalone="yes"?>
p搞定Q这样只需要用参数如 saveSnippet.html?decorator=simple&confirm=true Q就能让它用指定的 decorator 。然后做一个去?/span> head ?/span> footer 只保留必要的 js ?/span> css 引用?/span> simple.jsp 面Q同时在 decorator.xml 中配
应该可以搞定?/span>
但怎么,是不用这?/span> simple decorator 。没办法Q只好跟q?/span> sitemesh 源码中去调试Q进?/span> ParameterDecoratorMapper c,它(h)承了(jin) AbstractDecoratorMapper c,然后有一?/span> init Ҏ(gu)一?/span> getDecorator Ҏ(gu)。各打一个断点, init Ҏ(gu)?/span> tomcat 启动׃(x)执行Q也正常初始化了(jin)Q?/span> getDecorator Ҏ(gu)却始l不调用Q一时想不出办法。看到篇文章说不自己?/span> sitemesh.xml 而用自带的 com/opensymphony/module/sitemesh/factory/sitemesh-default.xml 也可以,于是备䆾q删除我写的 sitemesh.xml Q居然成功了(jin)。ؓ(f)什么我写的׃行呢Q差别一是我的简化了(jin)很多Q只?/span>
和刚加的
ParameterDecoratorMapper Q二是序Q我?/span> ParameterDecoratorMapper 攑֜?/span> ConfigDecoratorMapper 后面Q会(x)不会(x)是顺序原因呢Q调换一下,果然成功?jin)。问题是解决?jin),原理呢?再花?gu)间跟一下代码了(jin)解下原理Q原来用了(jin) Factory Q它?x)调用各个配|的 Mapper ?/span> init Ҏ(gu)Qƈ攑օ map 中,然后到时选择一?/span> Mapper Q如果符合条件就使用Q否则(h)l往(xin)下找。这里就有了(jin)序的问题,因ؓ(f)我在 decorator.xml 中用了(jin)另一U简单点的架构就是只?/span> F5 负蝲均衡Q不?/span> was 集群Q每?/span> websphere server 上的 HttpServer 接受 F5 转发的请求,只向?/span> server ?/span> was 转发。这h?/span> websphere server 保持独立Q相互间没有数据交换和{发。不妨称为架?/span> B ?/span>
架构 A ?/span> B 各有优劣Q适合不同的需要,下面q行些比较:(x)
Ø (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
从应用部|上看:(x)
A 使用?/span> websphere 集群Q由一?/span> DeployManager q行分发Q部|应用,只需部v一ơ,?/span> DM 分发到几个节点上。?/span> B 每个 server 都是独立的,部v应用只能一台台部vQ如?/span> server 较少差别q(sh)明显Q如果达?/span> 10 C上,一台台部v是一个比较痛苦的事情?/span>
Ø (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
?/span>
session
上看Q?/span>
A 使用?/span> websphere 集群Q可以用集提供的 session 复制Q对于一些关键应用(某台服务器宕机, session 也必M持的应用Q很有必要。而对于一些能够允?/span> session 丢失的应用,才可以?/span> B 。当?/span> A 也可以关?/span> session 复制Q因?/span> session 复制不管是用数据库方式q是内存方式QM(x)消耗一定的性能。具体消耗多性能Q就要看不同?/span> application server ?/span> session 复制Ҏ(gu)?jin),x(chng)入了(jin)解,可以看集方面的文档Q我也只记得一个比较简单的 round robbin ?jin)?/span>
Ø (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
从架构复杂性看Q?/span>
B 更ؓ(f)单,因ؓ(f)没有 DM 的概念,每台 server 都保持独立。而用了(jin) DM 有时也会(x)出现莫名奇妙的问题,q当然是׃不了(jin)?/span> DM 的机制所_(d)但d也增加了(jin)复杂度,q点在后面的教训中进行说明?/span>
Ø (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
从水qx(chng)展性上看:(x)
B 肯定更胜一{V只?/span> F5 能支持,多少?/span> server 都没关系。?/span> A 多台 server 做集,要看 websphere 支持的节Ҏ(gu)量,应该不会(x)太大。这个如果哪位同学知道,敬请告知?/span>
当然 A ?/span> B 在服务器较多的情况下是可以共存的Q可以考虑几台机器做集,然后集群间做负蝲均衡Q这h可以减少部v的复杂度Q又可以带来较好的水qx(chng)展。由于没做过更大型的目Q这个也只是我的假象Q请做过的同学斧正?/span>
说一说集中到的问题?/span>
Ø (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
首先是对各节点的同步Q?/span>
有时Z(jin)方便试Q我们只对其中一个节点进行更改,试通过再放到其它节炏V而如果测试周期较长,有时׃(x)造成节点的不同步Q出现各U各栯名其妙的问题。一个经验就是:(x)无论如何Q在每天下班前要保证各节点的同步Q不同步的现象不要过夜?/b>
Ø (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
然后是对
DM
的理解:(x)
我现在还只是实践阶段Q没有看q相x(chng)档。从意义上看Q它控制?jin)相关的配置文gQ如果进行节点同步,׃(x)由它把配|文件同步到它管理的节点上。这寚w|文件的修改提出?jin)要求。我们开始只修改节点的配|文件而没有修?/span>
DM
的,l果q行节点同步׃(x)覆盖修改的配|文Ӟ带来很多不必要的工作。经验就是:(x)或者修?/b>
DM
的配|文Ӟ然后q行节点同步Q或者直接同时修Ҏ(gu)有节点和
DM
的?/span>
Ø (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
q有关于
cache
的:(x)
Cache 是性能优化的一个有效手Dc(din)在单机环境下,最单的是内存 cache Q?/span> static ?/span> Map p。而在集群环境中, cache 变的比较复杂了(jin)。首先还是从应用需求入手,是否要保持每台机器的 cache 同步。如果只是信息展C等要求不高?/span> cache Q不需保证 cache 的同步,问题?sh)比较简单,自己写内?/span> cache Q或者用开源的 cache lg?/span> ehcache,oscache {就可以很好的解决问题。而如果需?/span> cache 在几个节点保持同步,需要特D的机制?jin)?/span> ehcache {号U支持分布式 cache Q但好像需?/span> jgroup Q配|比较麻?ch),我没有用q,有用q的同学h教。我本来想?/span> session 保存Q然后进?/span> session 同步Q后?/span> IBM 使用数据?/span> cache Q即自己写代码, cache 在数据库中。这样不需?/span> session 同步Q对象不大,性能也能得到保证Q现在用下来效果q可以?/span>
q次技术上值得推荐的就?b style="mso-bidi-font-weight: normal">合理的?/b> ajax Q既加快?jin)首늚?/span> load 速度Q又带来?jin)很好的用户体验。开始首上所?/span> portlet 都是串行加蝲Q有?/span> portlet 比如新邮Ӟ依赖?/span> mail pȝ提供的接口。开始这个接口在较大压力下就出现性能瓉Q后在我们的要求下替换了(jin)协议Q性能也在 1s-2s 之间。如果采用常规的办法Q加?/span> wps 验证、运,昄主题、皮肤,加蝲所?/span> portlet Q响应时间肯定在 10s 以上?/span>
我在 openfans 中用了(jin) ajax Q有些经验,所以决定采用异步加载:(x)首页 load 时一?/span> portlet 直接昄正在 loading 的字P?/span> body onload 时再使用 ajax 填充内容Q?/span> iframe ?/span> portlet Q也?/span> src 先指向一个静(rn)态的正在 loading 面Q?/span> body onload 时再替换 src 到实际地址Q这?/span> ajax 模式的一U)(j)。这样首늙录实际上只经q?/span> wps 内部的验证和昄Q所有业务逻辑都是加蝲成功后再q行q行。实际表现效果就是:(x)头上的主题很快出来,一块块区域昄正在 loading 字样Q性能快的 portlet 很快出来Q需要几U的 portlet 随后出来Q而不是让用户?c)?/span> 10 ?/span> s 再一下全部显C?/span>
使用 ajax 同时也能解决面h问题和获取返回值的问题。比如前面显C新邮g?/span> portlet Q用L(fng)M(jin)一邮Ӟ新邮件数应该?/span> 1 Q刚点击的邮件也应该上页面上消失。原始的做法是h整个面Q既加大服务器压力,又带来很差的用户体验。?/span> ajax Q在点击?/span> 1s Q或者更长,q取决于邮gpȝ对点?yn)L作的响应快慢Q刷?/span> div 的内容,用户甚至感觉不到内容已经更新。其?/span> portlet 也不需要重新蝲入,大大减轻服务器的压力。有的操作需要提交给其它pȝQ而且可能成功可能p|Q这需要获得返回倹{如果用普通的 form 提交Q需要更新整个页面。而?/span> ajax 提交Q可以方便的获得其返回|q而显CZ同的提示?/span>
另一个架构上的特点就?/span> portal 服务器职责单一 。开始所有的业务逻辑都是写在 portlet 里,加重?/span> portlet 服务器的压力。我q来后做的一个大的规划就是,把业务逻辑抽离到其?/span> server 上,然后通过 ajax 加蝲?/span> portlet 中。这h可以充分利用服务器资源(新的 server 使用单独的内存空间和U程池)(j)Q又使得 portal 服务器职责更单一Q仅q行验证、权限控制、主题、皮肤和 portlet 的展C?/span>
先写q么多。因Z用了(jin) 2 ?/span> server 做集,在分布式环境下,开发也有了(jin)更多的要求(比如 cache Q,后一文章再l细道来?/span>
众所周知软gq行压力是很大的。各U各L(fng)问题层出不穷Q每天上班工作内定w是排的满满的Q遇到突发问题就得加班。如果不?qing)时q行疏解Q积累到一定的E度Q就可能产生一定的负面问题Q比如上班精状态差、注意力不能集中、遇事喜Ƣ逃避{等。我׃w经历了(jin)q样的状况,明知自己工作U极性差、效率很低,但也很难一下子扑֛自我?/span>
一ơ偶然的出游让我从中很快C(jin)出来。一个亲戚考上厦大的博士,我请?/span> 2 天的假,利用周末旉Zd门旅游。厦门依山傍P的确是旅游的好去处。晚上到Q凉风习(fn)?fn),光脚沿着沙W走过QQ赯的潮水在腿上脚上留下层层薄沙。内?j)也变得q静(rn)Q能够感受到L(fng)呼吸。天地间仿佛(jng)只剩下我和大P在进行心(j)늚交流Q俗世烦(ch)扰皆抛诸脑后Q只剩下Ҏ(gu)v的依恋。白天去爬南普陀山,q不太高Q慢慢爬到山Ӟ整个思明区尽收眼底,q处一艘快艇在面掠过Q留下一条美丽的花。然后顺p下到植物园Q途径无数奇花异草、层天老树(wi)Q走得篏?jin),找个湖边矛_休息一下,Z觉得L愉快?/span>
l过大自然的z礼Q回到单位,人的_面貌焕然一斎ͼqU极的心(j)态处理事情,很多问题q刃而解。压力测试做的很累,l常要熬夜,但通过一轮轮的测试,逐步定位到性能问题所在,自己也学?jin)不相关知识,x(chng)也就没那么烦(ch)?jin)?/span>
做事的方式,也有?jin)长q。我现在信奉Z时只做一件事效率最高的原则。事情再多,也是一件g做,每天安排好近日的工作Qƈ排个优先U,什么是要亲自处理的Q什么是让别人处理的Q什么是需要预先通知他h的,需要什么资源,每g事情的预计时间如何,需要如?/span> check {等。做好一件事打个勾Q做到心(j)中有数。如果事情有延误Q分析是什么原因,该如何补救,而不要有太大的心(j)理负担,自己力?jin)就好,是自q责Qp勇敢扛下Q死不了(jin)人的。这其实是很单的原则Q谁都能够学?x),但的很用?/span>
ȝQ压力是无处不在的,关键在于如何应对和排解。用U极的心(j)态和恰当的方法面对,压力也就没那么大?jin)。感觉压力积累到一定程度,在还未媄(jing)响正常工作之前就先想办法排解Q出L游、运动等都是~解压力的好办法?/span>