2011-01-10 69 views

回答

107

JMS和斯卡拉行爲者共享理論上的相似性,但不要認爲他們必然在架構上解決相同的問題。參與者意在成爲共享內存併發的輕量級替代方案,其中種族和死鎖通常難以意外創建。 JMS是一個複雜的API,旨在跨越直接消息傳遞,發佈/訂閱,事務處理,EJB集成等。

與actor最接近的JMS相當於一個消息驅動Bean,它由非持久非 - 事務性,非發佈/子隊列。我會稱之爲「簡單的JMS bean」。

現在,您的問題。

性能是一件很難談論的事情,因爲JMS是一個規範而不是實現。無論如何,當使用簡單的JMS bean時,我認爲性能大致與時間和內存中的角色的邊緣相似。當您向JMS添加功能(例如發佈/訂閱)時,交易等性能自然會進一步降低,但您嘗試將蘋果與桔子進行比較。

至於可伸縮性,簡單的JMS bean的伸縮程度應與actor相同。將事務添加到JMS組合中自然會影響可擴展性,其數量取決於事務的範圍。

更廣泛的問題,演員做什麼,JMS不能。那麼,如果沒有內置的pub sub或者交易,那麼演員似乎會從JMS中減去 - 而且大體上這是事實。但事情是這樣的:演員需要的代碼非常少,以致於我可以愉快地將它們用於非常細緻的併發。在普通的Java代碼中,我可能會說「我不想用JMS及其依賴關係或它需要的代碼來搞砸,所以我只會產生一個線程,使用一個鎖,並共享一個數據結構。」對於斯卡拉演員,我更可能會說「我只是掀起一個演員,繼續前進。」

在設計上也存在哲學上的差異。演員有一個簡單的,建立在監督者層次結構的概念。演員通常用於「讓它崩潰」的設計。如果演員因某種原因而死亡,則另一個演員負責決定如何處理該演員,如重新啓動該演員,殺死一堆演員並重新啓動所有演員,或者殺死一羣演員和自己,以便其他演員可以處理這個問題。這種東西可以附加到JMS上,但它不是API的核心,必須以某種方式在外部進行管理。

順便說一下,對於一個斯卡拉演員圖書館,更多地進入JMS涵蓋的領域見Akka。 Akka還爲許多普通的參與者層次結構策略提供了一種陳述式的方法。

+0

我想我已涵蓋。我已經更新了最後幾段來澄清這一點,並且我還解釋了一些關於演員層級的內容。 – 2011-01-10 17:00:31

相關問題