小编典典

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

java

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

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


阅读 149

收藏
2020-11-01

共1个答案

小编典典

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还为许多常见的参与者层次策略带来了一种声明式方法。

2020-11-01