当试图分发需要多阶段处理流水线的工作时,JMS与JavaSpaces在通信、同步和吞吐量成本方面的限制是什么?
发布于 2008-09-29 09:52:03
如果您想要SEDA,从一个阶段发送消息到另一个阶段,那么JMS实现通常要快得多,并且更具可伸缩性,因为MOM被设计为不需要锁,因此它们可以是高度异步和并发的。使用JMS,您可以在启动时设置使用者,并且message broker通常会尽快将消息推送到您的应用程序,以便在您的应用程序可以处理它们时,随时可以处理许多内存中的对象-避免任何网络往返或锁定等。例如,请参阅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
发布于 2008-09-24 17:27:08
JMS是API,而不是产品。它不能有任何“通信、同步和吞吐量成本”。JMS的具体实现(Weblogic、JBoss、Tibco等)能。
JMS中没有同步函数,顺便说一下-- queue is queue,您不能让一条消息(在一个队列中)等待另一条消息(在另一个队列中)。
发布于 2009-02-02 18:07:18
要考虑的另一点是,JMS队列不提供基于大小的阻塞能力,因此纯SEDA实现很难使用纯JMS队列,因为它依赖于队列“填满”并在上游阶段施加反向压力。
https://stackoverflow.com/questions/127629
复制相似问题