什么devise决定会赞成Scala的Actor而不是JMS?

使用Scala Actor而不是JMS有什么不同?

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

JMS和斯卡拉参与者有相同的理论相似性,但不要认为他们必然在架构上解决相同的问题。 参与者的意图是共享内存并发的轻量级替代,其中种族和死锁通常难以意外创build。 JMS是一个复杂的API,旨在跨越直接消息传递,发布/订阅,交易,EJB集成等。

与actor最接近的JMS将是一个消息驱动bean,它由一个非持久的,非事务性的,非pub / sub队列支持。 我会称之为“简单的JMS bean”。

现在,你的问题。

由于JMS是一个规范而不是实现,因此性能是一件很难谈论的事情。 在使用简单的JMS bean的时候,我认为性能可能与时间和内存中的actor有些相似。 当你添加JMS的function,比如发布/订阅,交易等等,性能自然会进一步降低,但是你试图把苹果和橘子进行比较。

至于可伸缩性,简单的JMS bean应该和actor一样缩放。 将事务添加到JMS组合中自然会损害可扩展性,取决于事务的范围。

JMS不能做的事情是什么? 那么,如果没有内置的pub sub或transactions,那么演员似乎会从JMS中减去 – 而且大体上是这样的。 但事情是这样的:演员需要的代码太less,我可以愉快地使用它们来实现非常细致的并发。 在普通的Java代码中,我可能会说:“我不想用JMS及其依赖关系,或者它需要的代码等等,所以我只会产生一个线程,使用一个锁,并共享一个数据结构。 对于斯卡拉演员,我更可能会说“我只是匆匆演员,继续前进”。

在devise上也有哲学上的差异。 演员有一个简单的,build立在主pipe层次的概念。 演员通常用于“让它崩溃”的devise。 如果一个演员死于某种原因,另一个演员负责决定该怎么做,比如重新启动演员,杀死一堆演员并重新启动所有演员,或者杀死一堆演员和自己,以便其他演员可以处理这个问题。 这种事情可以附加到JMS上,但它不是API的核心,必须以某种方式在外部进行pipe理。

顺便说一下,对于一个斯卡拉演员图书馆,进入更多的领域,JMS涵盖阿卡 。 阿卡也给许多共同的演员分级战略带来了一个陈述式的方法。