ActiveMQ:批量发布消息,持久但不异步?

Posted

技术标签:

【中文标题】ActiveMQ:批量发布消息,持久但不异步?【英文标题】:ActiveMQ: Publish Messages in bulk, persistent, but not async? 【发布时间】:2011-11-24 14:13:35 【问题描述】:

是否可以批量存储大量消息? 我想向它们发送同步的、持久的,但要一次获得非常快的速度。

我正在使用 NMS,即 java 框架的 .net 版本。但是,如果您只知道如何在 java 中执行此操作,它甚至会有所帮助。也许我可以更轻松地找到 .net 的解决方案。

我想到了诸如交易之类的事情。但我只让交易为消费者工作,而不是为生产者工作。

【问题讨论】:

【参考方案1】:

传统观点认为,如果您希望在批量发送时获得最大吞吐量,那么您应该使用 SESSION_TRANSACTED 确认模式并将所有消息与 .commit() 一起发送。

不幸的是,这里有一个基准测试表明情况并非如此http://www.jakubkorab.net/2011/09/batching-jms-messages-for-performance-not-so-fast.html,您最好在没有交易的情况下正常发送它们。如果您已经在使用事务,那么尝试对它们进行批处理可能是有意义的。

我在这里的建议也是,除非您正在处理对时间极为敏感的消息,否则您生成的速率不会有那么大的问题 - 您应该更关心带宽而不是速度的消息发送。如果您不介意您的消息乱序,您可以让多个生产者将这些消息生成到给定的目的地......或者如果您需要它们以便使用多个生产者,然后在它们位于代理后使用resequencer。

【讨论】:

感谢您提供有趣的链接和您的回答。我发现当我使用事务时,我可以提高速度,每 100 条消息提交一次,但发送异步。您知道异步发送 100 条消息然后提交是否与一条一条发送 100 条消息但同步发送相同吗? 我在您必须同步的前提下回答... 当我调用 producer.Send() 或 session.Commit() 时,我必须确保我发送的所有消息都会到达代理。发送异步但调用 session.Commit() 时,我可以确定所有发送的消息都到达并存储到磁盘吗?还是我在发送异步时无法确定,无论是否使用事务? commit() 构成“同步”部分,因为您的客户端和代理将确保客户端发送的任何消息都已被代理在 commit() 成功返回之前收到。 感谢您的回答。然后我会用那种方式发送消息。

以上是关于ActiveMQ:批量发布消息,持久但不异步?的主要内容,如果未能解决你的问题,请参考以下文章

JMS与ActiveMQ消息数据持久化

ActiveMQ---ActiveMQ原理分析之消息发送

ActiveMQ(15):Message Dispatch的消息游标与异步发送

ActiveMQ从入门到精通

从入门到精通ActiveMQ

从入门到精通ActiveMQ