- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
使用 Scala Actors 而不是 JMS 有什么区别?
例如,从性能和可扩展性的角度来看,与 JMS 相比,Scala Actor 模型增加了什么?在哪些情况下使用 Actors 而不是 JMS 更有意义,即 Actors 解决了哪些 JMS 无法解决的问题?
最佳答案
JMS 和 Scala 角色在理论上有相似之处,但并不认为它们必须在架构上解决相同的问题。 Actor 旨在成为共享内存并发的轻量级替代方案,其中竞争和死锁通常更难意外创建。 JMS 是一个复杂的 API,旨在跨越直接消息传递、发布/订阅、事务、EJB 集成等。
与参与者最接近的 JMS 是消息驱动的 bean,它由非持久性、非事务性、非发布/订阅队列支持。我称之为“简单的 JMS bean”。
现在,回答你的问题。
性能是一个很难谈论的事情,因为 JMS 是一种规范而不是一种实现。尽管如此,当使用简单的 JMS bean 时,我希望性能大致相似,并且可能在时间和内存方面对 Actor 有一点优势。当您向 JMS 添加功能(例如发布/订阅、事务等)时,性能自然会进一步下降,但您正在尝试将苹果与橙子进行比较。
至于可伸缩性,简单的 JMS bean 的伸缩方式应该与参与者的伸缩方式几乎完全相同。将事务添加到 JMS 组合中自然会在一定程度上损害可伸缩性,具体取决于事务的范围。
更广泛的问题是 Actor 可以做什么而 JMS 不能。好吧,如果没有内置的 pub sub 或 transactions,actor 似乎会从 JMS 中减去 - 总的来说这是真的。但事情是这样的:actor 需要的代码非常少,以至于我可以很高兴地将它们用于非常细粒度的并发。在普通的 Java 代码中,我可能会说“我不想搞砸 JMS 及其依赖项或它需要的代码等,所以我只会产生一个线程,使用一个锁,并共享一个数据结构。”对于 Scala Actor ,我更有可能说:“我会挑选一个 Actor 然后继续前进。”
在设计上也存在哲学差异。 Actor 有一个简单的、内置的主管层次结构概念。 Actors 通常用于“让它崩溃”的设计。如果一个 Actor 因某种原因死亡,那么另一个 Actor 负责决定如何处理它,例如重新启动该 Actor ,杀死一堆 Actor 并重新启动所有 Actor ,或者杀死一堆 Actor 和自己,以便其他 Actor 可以处理问题。这种东西可以附加到 JMS 上,但它不是 API 的核心,必须以某种方式在外部进行管理。
顺便说一下,对于更多进入 JMS 涵盖的领域的 Scala Actor 库,请参阅 Akka . Akka 还为许多常见的 Actor 层次结构策略带来了一种声明式方法。
关于java - 什么样的设计决策会支持 Scala 的 Actor 而不是 JMS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4648280/
我正在读这个 question和 corresponding answer并被答案第一行中的术语 JMS broker 弄糊涂了: MS (ActiveMQ is a JMS broker imple
我正在学习 API 中的 Reactive Streams,我对它与 JMS 之间的相似性感到震惊。在 JMS 中,我们也有异步处理、发布者和订阅者。我在进行这种等效时缺少什么观点? 最佳答案 Rea
假设生产者向 JMS 主题“新闻”发送一条消息。消费者 1 读取了消息,但消费者 2 处于离线状态,因此他还没有读取消息。 是否有任何内置(针对规范或实现)的方式来通知生产者消费者 1 已阅读他的消息
目前我正在开发一个 JMS 应用程序。但我使用普通的 JMS API 和属性文件进行配置。我的应用程序在 Weblogic 中运行并连接到我客户端的 MQ 系列服务器。 最近我知道我可以使用 Webl
我正在尝试使用 Solace 中可用的异步发送功能,但我打算使用 JMS 进行抽象,而不是直接使用 JCSMP 使用它。 JMS 2.0 支持异步发送以及其他新功能:http://www.oracle
我无法获得 javax.jms.ConnectionFactory注入(inject)我的独立 JMS 客户端。 我得到一个 java.lang.NullPointerException在 conne
保持 JMS 连接/ session /消费者始终打开是一种不好的做法吗? 代码草稿示例: // app startup code ConnectionFactory cf = (Connection
我有几个作业,每个作业都有多条消息排队。每个作业的消息随机交错。如果用户决定取消作业,我想从队列中删除属于该作业的所有消息。我已经能够使用 browse() 找到所有要删除的消息,但一直无法弄清楚如何
是否可以将主题配置为仅存储最后一条消息的副本并将其发送到新连接而不知道客户端标识符或其他信息? 更新: 从 Shashi 提供的信息中,我发现这两页使用 retroactive consumer 描述
目前正在使用 WebLogic 和分布式队列。我从文档中了解到,分布式队列允许您使用全局 JNDI 名称检索到集群中任何队列的连接。分布式队列为您提供的主要功能之一似乎是跨多个托管服务器的负载平衡连接
再见,我的基本要求是有一个可以发送消息的路由,并将其放在 JMS 队列中。 camel 上下文在 JavaEE 6 容器中运行,即 JBoss AS 7.1.1,因此它是 HornetQ for JM
我正在阅读 JMS 2.0 规范,其中提到(相关摘录下方)如果客户端尝试修改 Message 对象,则 JMS 提供程序可能会抛出异常。 我的问题是 JMS 提供者如何知道客户端是否试图修改 Mess
我的 spring 上下文文件中有以下设置。 "PowerEventQueue" “${
我正在尝试使用 JSP 连接到 ActiveMQ。但是,当我运行该程序时,它给了我以下类型的异常: NoClassDefFoundError: javax/jms/Destination . 我不确定
我刚看了CORBA和JMS,他们好像都是用来实现的代理架构/模式。 我对他们有几个问题 1.他们之间的区别我还不是很清楚,谁能解释一下? 2.CORBA 是否用于当今的 IT 解决方案?还是正在失去魅
我正在更新现有的 Mule 配置,任务是增强它以根据消息的某些属性将消息路由到不同的端点,因此最好对我手头的两个选项有一些利弊: 在消息上添加属性,使用“message-properties-tran
我有一个订阅 JMS 主题应用程序的 Java 应用程序,该应用程序偶尔会出现以下异常: javax.jms.JMSException: Connection has been terminated
我知道 Camel 的 JMS 组件用于接收消息,使用 Springs DefaultMessageListenerContainer。它可以配置为使用 CLIENT_ACKNOWLEDGE 模式来确
通常不鼓励使用从 JMS 提供者返回的消息 ID 作为相关 ID,将消息发布到队列中。人们如何为请求/响应架构生成相关 ID? 最佳答案 客户端可以使用唯一的 ID 标准,如 UUID生成新的 ID。
我有一个简单的代码可以将 2 条消息放入队列中。 1) 我用两台服务器设置了 connectionNameList。 2) 这两个服务器是独立的,但有相同的队列管理器和定义相同名称的队列,例如“QMg
我是一名优秀的程序员,十分优秀!