哪些设计决策会偏爱Scala的Actors而不是JMS?


81

使用Scala Actors代替JMS有什么区别?

例如,从性能和可伸缩性的角度来看,与JMS相比,Scala Actor模型增加了什么?在哪种情况下,使用Actor而不是JMS更有意义,即Actors解决了JMS无法解决的哪些问题?

Answers:


112

JMS和Scala参与者在理论上有相似之处,但他们认为它们并不一定在架构上解决相同的问题。参与者本来是共享内存并发的轻量级替代品,在共享内存并发中,种族和僵局通常更难以意外创建。JMS是一种复杂的API,旨在跨越直接消息传递,发布/订阅,事务,EJB集成等。

与参与者最接近的JMS将是由非持久,非事务性,非发布/订阅队列支持的消息驱动bean。我将其称为“简单的JMS bean”。

现在,您的问题。

由于JMS是规范而非实现,因此性能很难谈论。但是,当使用简单的JMS Bean时,我希望性能大致相似,并且在时间和内存方面可能比actor略有优势。当您向JMS添加诸如发布/订阅,事务等功能时,性能自然会进一步下降,但是您正在尝试将苹果与桔子进行比较。

至于可伸缩性,简单的JMS Bean的扩展方式应与参与者几乎完全相同。将事务添加到JMS组合中,自然会在一定程度上损害可伸缩性,具体取决于事务的范围。

参与者做什么,JMS不能做的更广泛的问题。好吧,如果没有内置的pub sub或事务,似乎参与者会从JMS中减去-大致上是正确的。但这就是问题:参与者只需很少的代码,我可以很高兴地将它们用于非常细粒度的并发。在普通的Java代码中,我可能会说:“我不喜欢使用JMS及其依赖项或所需的代码,等等,所以我仅生成一个线程,使用一个锁,并共享一个数据结构。” 与Scala演员一起,我更有可能说“我会鞭打一个演员继续前进”。

在设计上也有哲学上的差异。参与者具有一个简单的内置主管层次结构概念。角色通常用于“让它崩溃”设计中。如果一个演员死于某种原因,那么另一个演员负责决定如何处理,例如重新启动该演员,杀死一群演员并重新启动所有演员,或者杀死一群演员及其本身,以便其他演员可以处理问题。这种东西可以附加到JMS上,但它不是API的核心,必须以某种方式从外部进行管理。

顺便说一下,对于一个Scala actor库,它可以更深入地进入JMS涵盖的领域,请参见Akka。Akka还为许多常见的参与者层次策略带来了一种声明式方法。


我想我已经涵盖了。我已经更新了最后几段以澄清这一点,并且我还解释了一些有关演员层次结构的内容。
James Iry

2
克里斯蒂安,不完全是。Akka演员通常比Scala演员更轻便。但是,它们的API和配置设置稍微复杂一些。当延迟/吞吐量不成问题时(例如,用于生成工作任务),我使用Scala actor;而当Akka actor成为问题或需要我进行监督时,我将使用Scala actor。
亚历山大·特梅列夫

8
我认为在这里还应该指出,通常,JMS实现将需要外部代理,而Akka / Actor无需外部代理即可运行。当然,如果你想进程间/屋主信息,你会选择适当的。
贾森克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.