TerraCotta  通過(guò)將POJO對(duì)象在群集內(nèi)下的共享,讓POJO不再局限于SNA(Share Nothing Architect)的架構(gòu),比較透明的支持了集群模式,可謂POJO開(kāi)發(fā)模型的最后一塊拼圖。

      實(shí)它的原理很簡(jiǎn)單,本身是一個(gè)中央式的Cache服務(wù)器。在應(yīng)用啟動(dòng)命令中添加Terracotta參數(shù),Classloader就會(huì)根據(jù)配置文件在JVM級(jí)以AOP方式修改ByteCode,用戶透明地將對(duì)象存儲(chǔ)于中央服務(wù)器。

      為了性能,它以對(duì)象屬性而不是整個(gè)對(duì)象為存儲(chǔ)單位;為了可用性,它本身也支持主備集群。

  
     研究院和項(xiàng)目組的同事們?cè)缇驮谒麄兊牡乇P上用上了,這幾天自己也跟風(fēng)了一把。

     很喜歡這種"前商業(yè)項(xiàng)目",一般都會(huì)有不錯(cuò)的工具。 
  • Sessions Configurator 。以Debug模式將tc-confg.xml運(yùn)行在一個(gè)預(yù)配置的雙機(jī)集群下,讓你觀察共享對(duì)象的數(shù)值變化,出現(xiàn)運(yùn)行時(shí)錯(cuò)誤時(shí),提示配置文件缺漏錯(cuò)誤的修正。
  • Eclipse插件。通過(guò)對(duì)著任意的類、屬性、函數(shù)點(diǎn)右鍵來(lái)設(shè)定tc-config.xml。

     說(shuō)是用戶透明,其實(shí)只是最美好的愿望,可能還是有些代碼修改:

  • 同步問(wèn)題。原本單機(jī)運(yùn)行的程序,改成集群運(yùn)行,跑不掉的是先要將自己共享對(duì)象類的代碼改為線程安全的,如使用線程安全的ConcurrentHashMap 、AtomicInteger屬性,或在訪問(wèn)屬性的代碼中加入synchronized控制。然后在xml中配置Terracotta的autolock將鎖其擴(kuò)展到群集范圍,設(shè)定以鎖為邊界的批量更新屬性的事務(wù)。
    反向理解TC的CTO同志關(guān)于調(diào)優(yōu)的講話,鎖沒(méi)搞好的話對(duì)性能影響挺大。
  • 本地資源屬性。有些很local的屬性如文件句柄是沒(méi)辦法共享的,這時(shí)候就需要配置為Transients 屬性。這種屬性在另一個(gè)JVM里就會(huì)被強(qiáng)制設(shè)為Null。怎么辦呢?推薦的做法是另寫一個(gè)初始化這些屬性的init函數(shù),在tc-config.xml中配置調(diào)用。更少侵入的做法是直接在tc-config.xml中寫beanshell腳本,不過(guò)這腳本不好寫。

     最后TC承擔(dān)了實(shí)現(xiàn)POJO集群的功能,但TC Server本身就存在單點(diǎn)故障的危險(xiǎn),需要配成Cluster模式。在TC的Persistent HA Cluster模式中,所有數(shù)據(jù)會(huì)Persist到磁盤,Cluster中永遠(yuǎn)只有一個(gè)Active Node,其他節(jié)點(diǎn)就作為Passive Nodee。Active Node的失效切換與Client的重連都是透明的。 Passive 與Active Node使可以用同一塊支持文件鎖的磁盤空間,也可以讓Active Node將所有變化通過(guò)網(wǎng)絡(luò)同步到Passive Node上。一般采用后者。


       另外,已經(jīng)可以買國(guó)內(nèi)的技術(shù)支持服務(wù)了。唯一遺憾要到12月份的TC2.7版,才會(huì)支持Glassfish 2。