使用Scala Actor而不是JMS有什麼不同?例如,從性能和可伸縮性的角度來看,與JMS相比,Scala Actor模型添加了哪些內容?在哪些情況下使用Actor而不是JMS更有意義,即Actors解決JMS無法解決的問題?什麼設計決定會贊成Scala的Actor而不是JMS?
回答
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還爲許多普通的參與者層次結構策略提供了一種陳述式的方法。
- 1. Scala:爲什麼刪除不贊成filterNot?
- 2. JMS會話的目的是什麼?
- 3. 不贊成readLine()要更改什麼?
- 4. 爲什麼Hibernate似乎是爲短期會話而設計的?
- 5. C++ 17中不贊成使用std :: result_of的原因是什麼?
- 6. Flex中ItemPendingError背後的設計決定是什麼?
- 7. 合併IplImage和cv :: Mat的設計決定是什麼?
- 8. 贊成Javascript設計模式勘誤?
- 9. 什麼是JMS?JMS中的XML
- 10. 爲什麼設計決定採用了不同的括號?
- 11. 是datastore mapreduce不贊成
- 12. 爲什麼NSCell不贊成使用,爲什麼首先推出?
- 13. 爲什麼JMS會話對象不是線程安全的?
- 14. 爲什麼會設置view.layer.contents而不是使用UIImage的
- 15. 爲什麼不preg_match返回數據?設計決定?
- 16. 不贊成Typedef
- 17. 不贊成
- 18. 爲Java而不是JMS使用WebSphere MQ類有什麼好處?
- 19. 爲什麼python設計爲str(None)會返回'None'而不是空字符串?
- 20. 數據庫設計:贊成抽象還是外鍵約束?
- 21. Scala Remote Actor安全
- 22. UML actor的作用是什麼?
- 23. 不贊成使用計數軌4
- 24. 爲什麼我決定從AngularJS開始,而不是Angular 2
- 25. 什麼使用,而不是會話?
- 26. 什麼是iChat的設計?
- 27. 爲什麼maven-war-plugin會生成一個JAR而不是WAR?
- 28. 爲什麼它被設計爲{uri.var.variable}而不是使用plain {variable}?
- 29. 什麼是非鎖定設計模式?
- 30. 爲什麼我會得到恆定的回報而不是scope_identity?
我想我已涵蓋。我已經更新了最後幾段來澄清這一點,並且我還解釋了一些關於演員層級的內容。 – 2011-01-10 17:00:31