ActiveMQ和Java-发布和使用之间的延迟

问题描述

我有一台服务器,在那台服务器上有一台将消息发送到单个队列的发布者。从该队列中读取,我有5个使用者,每个使用者都在自己的JVM上。这个想法是,无论哪个消费者免费,都应尽快使用发布者的消息。有时这5个消息都是免费的,然后ActiveMQ大概选择一个消息来接收/出队消息(?)。

所有消息都是非持久的。我几乎只使用ActiveMQ,只有1个队列,零修改任何配置文件。我也使用交易。

发布者返回后立即以毫秒为单位记录时间:

public void sendMessage(String text) {
    TextMessage message = null;
    try {
        message = session.createTextMessage(text);
        producer.send(message);
        System.out.println("JUST FINISHED SENDING MESSAGE " + System.currentTimeMillis());
    } catch (JMSException e) {
        e.printstacktrace();
    }
}

每个使用者(运行自己的JVM)正在该队列上侦听一次2分钟的突发事件:

        Message message = consumer.receive(120000);
        if (message instanceof TextMessage) {
            TextMessage textMessage = (TextMessage) message;
            text = textMessage.getText();
            System.out.println("MESSAGE RECEIVED " + System.currentTimeMillis());
        }

通常消费者将在与“仅完成发送的消息”完全相同的时间内(毫秒)记录“已收到消息”,这是完美的。但是有时,即使所有消费者都坐着不动,发布和消费之间也会有莫名其妙的延迟,大约15毫秒。鉴于所有进程都在同一台服务器上,并且延迟绝对至关重要,所以令我沮丧的是有时会出现这种延迟。

  1. 从1个队列中运行多个使用者时是预期的,还是无关紧要的?
  2. 我能做些什么来减轻延迟吗?

在此先感谢您提供任何有用的建议。

解决方法

在与网络使用者和中央经纪人打交道时,出现此类短暂延迟的原因有很多。代理程序或使用者的CPU调度以及管理网络接口所完成的工作可能会导致小的麻烦。当使用者或代理上的JVM清理时,您可能还会看到GC暂停,这可能会延迟分发或使用。当然,线程间信号交换有时可能会短暂延迟,具体取决于并发运行的各种事物,因此,这些短暂的停顿确实是我要投入大量时间的事情,除非您到达要解决的最后一个问题在您尚未处理的所有其他可能事情中。