在尝试分配需要多阶段处理管道的工作时,JMS 与 JavaSpaces 的通信、同步和吞吐量成本限制是什么?
3 回答
如果您想要 SEDA,从一个阶段到另一个阶段发送消息,那么 JMS 实现通常更快且更具可扩展性,因为 MOM 被设计为不需要锁,因此它们可以是高度异步和并发的。使用 JMS,您可以在启动时设置使用者,消息代理通常会尽快将消息推送到您的应用程序,以便在您的应用程序可以处理它们时随时处理许多可用的内存对象 - 避免任何网络循环行程或锁定等。例如,请参阅预取如何与 ActiveMQ 一起工作
使用 JavaSpaces 进行消息传递往往效率较低,因为它们通常是使用更以数据库为中心的方法来实现的,即使用锁读取/写入条目等。因此,您倾向于查询对象,然后使用 JavaSpaces 处理它们,这往往有点更健谈,消息传递效率更低。
JavaSpaces 方法的最大赢家是如果您想要共享状态;您可以将 JavaSpace 用作一种数据库。虽然如果你真的想要一个数据库,你可以使用带有 JMS 的关系数据库;但是 JavaSpace 的人们喜欢使用单一系统来共享状态和消息传递。
FWIW 通常没有中间件的灵丹妙药;有时在内存中 SEDA 是您所需要的,有时是 JMS,有时是关系数据库,有时是目录中的文件。这完全取决于您的要求、可扩展性、吞吐量、可靠性等。我倾向于建议人们从他们的代码中隐藏中间件 API,以便他们可以通过简单的一行配置更改(例如使用 Apache Camel)轻松切换到他们想要的任何中间件
JMS 是 API,而不是产品。它不能有任何“通信、同步和吞吐量成本”。具体实现JMS(Weblogic、JBoss、Tibco、...)即可。
JMS 中没有同步功能,顺便说一句——队列就是队列,你不能让一条消息(在一个队列中)等待另一条消息(在另一个队列中)。
要考虑的另一点是,JMS 队列不提供基于大小进行阻塞的能力,因此纯 SEDA 实现很难使用纯 JMS 队列,因为它依赖于队列“填满”并在上游阶段施加背压.