我使用的是hornetq核心客户端api 2.4.0.Final,使用以下代码添加了消息:
ClientMessage clientMessage = _producerClientSession.createMessage(true);
clientMessage.putStringProperty(MESSAGE_KEY, message);
_clientProducer.send(clientMessage);正如文档中提到的那样,我正在重用ClientSession和ClientProducer。在分析过程中,我们看到这需要平均400+ ms。这看上去对吗?看上去很慢。我们还在ubuntu上安装并运行了AIO。
编辑:这是"iostat -d -x 1“的输出,而在avg上排队的时间是600 is
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 0.00 0.00 596.00 0.00 2568.00 8.62 1.20 2.01 0.00 2.01 0.04 2.40
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 44.00 0.00 611.00 0.00 12904.00 42.24 0.10 0.17 0.00 0.17 0.05 2.80
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 0.00 0.00 642.00 0.00 2916.00 9.08 0.02 0.03 0.00 0.03 0.03 2.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 0.00 0.00 648.00 0.00 2900.00 8.95 0.03 0.04 0.00 0.04 0.04 2.80编辑#2我们更新了配置,包括:
Configuration configuration = new ConfigurationImpl();
configuration.setPersistenceEnabled(true);
configuration.setJournalSyncTransactional(false);以及创建ClientSessionFactory以:
ClientSessionFactory sf = null;
try {
hornetQServer.start();
ServerLocator serverLocator = HornetQClient.createServerLocatorWithoutHA(new TransportConfiguration(InVMConnectorFactory.class.getName()));
serverLocator.setBlockOnDurableSend(false);
serverLocator.setProducerWindowSize(100000);
serverLocator.setBlockOnAcknowledge(false);
ClientSessionFactory sf = serverLocator.createSessionFactory();发送时间现在还不到一毫秒。这些设置中的任何一种是否不安全,或者对于典型情况不推荐?
发布于 2014-03-18 13:46:25
当您有一个生产者时,必须将一条持久消息保存在磁盘上,并同步到您的磁盘上。
客户端将阻塞,直到所有这些发生。
服务器被编程用于管理多个生产者并使用大部分硬件,但是如果您只有一个生产者,则您的性能将因网络延迟+磁盘同步速度而大大降低。
因此,对于单个生产者来说,以非事务方式发送持久消息(每次发送都是同步)听起来是正确的。
编辑:还可以查看ConfigurationImpl上的set/getJournalBufferTimeout_AIO和set/getJournalBufferTimeout_NIO。这些值在服务器同步磁盘上的数据之前发送到TimedBuffer,等待其他客户端同时同步。
https://stackoverflow.com/questions/22471368
复制相似问题