Gemstone在RailsConf上所展示的Maglev Demo展現了Gemstone的分布式VM技術,它可以透明地跨越多個Gemstone VM以共享相同的對象內存。
Terracotta是一項Java技術,它也可以完成類似的功能。Fabio Kung已經開始了一些嘗試以將Terracotta應用到JRuby上。過去他也嘗試過一些類似的項目。Gemstone還嘗試了在其基于Java的產品上支持JRuby,之前他們也嘗試過將Terracotta應用到JRuby上,盡管沒有取得實質性的突破。
我們采訪了Fabio Kung以了解該項目,他稱這個項目為“JMaglev”,我們想知道要想讓JRuby和Terracotta協同工作需要做哪些事情以及需要解決哪些問題。
首先,Fabio談到了他的實現以及他是如何對JRuby進行了修改以讓其正常工作:
我使用了Terracotta POJO集群以便JRuby內核可被集群中的所有節點所共享。事實上,每次運行都會有一些全局變量,像下面這樣:
public class Ruby {
// ...
private GlobalVariables globalVariables = new GlobalVariables();
}
及:
public class GlobalVariables {
// ...
private List values = new ArrayList();
}
Terracotta僅僅對這個全局變量列表進行集群。對該列表的任何改變都會被復制到集群中的所有JRuby運行時。這樣做的好處在于你可以將任何
ruby對象增加到該列表中,甚至連復雜的對象如regexps、hashes和procs都可以。所有的全局變量都會自動被共享,同時由全局變量所引用
的任何對象都會被Terracotta加到集群中。
為了做到這一點,我需要對JRuby進行一些修補,使其可以被“集群”。事實上,JRuby中的每個ruby對象都會維護一個ruby運行時引用。由于共
享的對象會用在很多不同的運行時中,所以JRuby必須得支持運行時的增加及刪除。我可以解決這個問題,但是每個JVM上只能有一個Ruby運行時。在這
個地方仍然有一些尚未解決和需要討論的問題,如:
——全局對象標識符:在所有節點中object_id都應該相同么?——共享的元類(metaclass):當不同節點中的對象類、父類或者是包含的模塊發生變化時怎么辦?——在單個JVM上對多個運行時的支持。
對于這些問題我采取了簡單的解決方法,但每種方法都需要一整篇博文才能說明白:-)
Fabio解釋了他知道的一些針對JRuby和Terracotta的用例:
通過使用Terracotta的High
Availability模式,我認為“JMaglev”(或許需要起個更好的名字)絕對能成為一個很棒的memcached而無需侵入Ruby代碼。然
而還有很多事情需要做。這就是我將其開放的原因所在,如果大家感興趣,都可以盡一份力:http://github.com/fabiokung/clustered-jruby/
很多服務器都可以配置在Terracotta中,其中一個服務器叫“主”服務器(或者叫活動服務器),其他的處于備用模式。這很有意思,因為一旦活動服務
器崩潰,其他的就會自動頂替上去。在Terracotta的企業版中甚至還有一種可用的模式,該模式可以開啟多個活動服務器,這與memcached所做
的事情差不多,但是memcached不會持久化對象。
Terracotta可作為一個分布式緩存,同時無需Java序列化:它僅僅復制改變的東西。你只需要將想從數據庫中取出的對象共享給集群中所有的節點即
可。通過使用JMaglev,你只需將他們放到全局變量中即可——$shared = Person.find(:all)。
其他可能的用例是在Rails應用中的多個進程和機器上共享HttpSession。如果將rails應用部署到JRuby中,那么可以使用透明的集群對象來維護集群中所有節點所共享的HttpSession。
事實上,任何Terracotta用例都是JMaglev用例。坦誠地說,就是因為這是可行的,我才這么做。這與Avy
Briant的Maglev例子非常像:他說可以使用SmallTalk
VMs運行Ruby代碼,然后Gemstone的那些家伙讓他證明這是可行的:-)
我希望那些比我更富創造力的人們能為“JMaglev”想出更多創造性的用例。
分布式的對象內存僅僅是Gemstone/S(以及MagLev)諸多特性中的一個;另一個重要特性是持久化。正如Gemstone的Monty Williams在最近的一個關于Rails的播客中所說,Gemstone/S支持對象內存的持久化,這意味著我們無需ORM甚至是RDBMS來存儲數據。
當被問到“JMaglev”是否支持類似的功能時,Fabio說到:
所有共享的ruby對象都位于Terracotta服務器中,而Terracotta服務器能自動地持久化這些對象,即使他們不
是序列化的也可以。客戶端持有這些真正的、共享的對象的樁(stubs)。你只需將服務器配置成持久化模式即可。我還沒有測過,但這需要在XML配置文件
中增加一行。
我認為Terracotta可作為一個面向對象的數據庫以持久化JRuby對象,但我覺得這不是目前最主要的目標。Terracotta現在可以通過其
High Availability模式來持久化共享的對象,這存在于fail-safe-high-available部署中。http://www.terracotta.org/web/display/docs/Configuring+Terracotta+For+High+Availability。
Terracotta的站點上列出了很多Terracotta集成模塊(Terracotta Integration Modules,即TIM),其中一些面向的是流行的ORM解決方案。當被問到這是否有助于持久化時,Fabio說到這些TIM的目的是不同的:
這些TIM并不涉及共享對象的自動持久化。他們僅有助于Terracotta與這些ORM框架的協作。例如,hibernate
TIM與持久化沒有任何關系。它僅僅是簡化了Hibernate對集群的(分布式的)EhCache(以及其他)的使用而無需真正的分布式緩存,如
JBoss TreeCache和memcached。
Fabio展示了JRuby與Terracotta是如何協作的。要想嘗試一下,請參考Fabio在Github上的clustered-jruby倉庫,它提供了你所需要的所有內容。
Orther:
Ibatis技術文檔
Hibernate常見問題總結
posted on 2008-12-18 20:01
墻頭草 閱讀(1249)
評論(0) 編輯 收藏 所屬分類:
業界資訊