通过JMS或JavaSpaces分发多阶段任务有哪些优缺点?

时间:2008-09-24 14:49:51

标签: java scalability jms distributed javaspaces

当尝试分发需要多阶段处理管道的工作时,JMS与JavaSpaces之间的通信,同步和吞吐量成本限制是什么?

3 个答案:

答案 0 :(得分:2)

如果您需要SEDA,从阶段到阶段发送消息,那么JMS实现通常更快,更具可伸缩性,因为MOM被设计为不需要锁定,因此它们可以是高度异步和并发的。使用JMS,您可以在启动时设置使用者,并且消息代理通常会尽快将消息推送到您的应用程序,以便在您的应用程序可以处理它们时,可以随时处理许多内存中对象 - 避免任何网络轮次旅行或锁定等。例如参见how prefetch works with ActiveMQ

使用JavaSpaces进行消息传递往往效率较低,因为它们通常使用更加以数据库为中心的方法来实现,这种方法使用带有对条目的读/写等的锁。因此,您倾向于查询对象,然后使用JavaSpaces处理它们。对于消息传递来说,它会更加健谈,效率更低。

JavaSpaces方法的最大胜利就是如果你想要共享状态;您可以将JavaSpace用作有点数据库。虽然如果你真的想要一个数据库,你可以使用JMS的关系数据库;但JavaSpace人喜欢使用单一系统进行共享状态和消息传递。

FWIW通常没有中间件的银色欺负;有时在内存中SEDA就是您所需要的,有时是JMS,有时是关系数据库,有时是目录中的文件。它完全取决于您的要求,可扩展性,吞吐量,可靠性等。我倾向于向人们推荐hide middleware APIs from their code so that they can switch to whatever middleware they want easily via a simple one line config change such as with using Apache Camel

答案 1 :(得分:1)

JMS是API,而不是产品。它不能具有任何“通信,同步和吞吐量成本”。 JMS(Weblogic,JBoss,Tibco,...)的具体实现可以。

JMS中没有同步功能,btw - queue是队列,你不能让一条消息(在一个队列中)等待另一条消息(在另一个队列中)。

答案 2 :(得分:0)

还有一点需要考虑,JMS队列不提供基于大小阻止的能力,因此纯SEDA实现很难使用纯JMS队列,因为它依赖于队列“填满”并施加背压在上游阶段。