ActiveMQ & Java - 发布和消费之间的延迟

ActiveMQ & Java - delays when between publish & consume

我有一台服务器,我有一个发布者将消息发送到单个队列。从这个队列中读取我有 5 个消费者,每个消费者都有自己的 JVM。这个想法是发布者的消息应该尽快被空闲的消费者消费。有时所有 5 个都是免费的,然后 ActiveMQ 可能会选择一个 receive/dequeue 消息 (?)。

所有消息都是非持久性的。我几乎开箱即用地使用 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 代理或消费者的调度以及管理网络接口的工作可能会导致小问题。您可能还会看到 GC 暂停,因为消费者或代理上的 JVM 清理可能会延迟调度或消费。当然 inter-thread 歌唱有时可能会有短暂的延迟,具体取决于各种因素 运行 ,所以这些短暂的停顿真的是我会投入大量时间的东西,除非你到了那个地步您需要解决的最后一个问题是您尚未处理的所有其他可能的事情。