使用ActiveMQ调度程序降低性能

时间:2015-05-21 08:47:07

标签: java performance apache-camel activemq

在我们的一个项目中,当我们使用具有大量消息(1M或更多)的调度工具(在ActiveMQ配置中启用schedulerSupport)时,我们正在遭受ActiveMQ性能下降的困扰。该项目是基于Spring的,我们也使用Camel进行路径管理。

我们的路线配置如下:

  • 生产者P生成800条消息/秒并通过非持久性ActiveMQ队列Q
  • 发送它们
  • 消费者Cq根据以下规则处理来自Q的消息:对于每个消息,它验证消息是否可以立即处理(每个消息都具有定义该消息的时间窗口属性)。如果可能,Cq将消息转发到限制队列T;如果不是,Cq将消息转发到支持队列S
  • 消费者Cs处理来自S的消息,并根据其时间窗口调度消息(使用以下语句设置ActiveMQ属性ScheduledMessage.AMQ_SCHEDULED_DELAYmessage.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, <delay>);)其中评估<delay>根据消息时间窗口
  • 当从ActiveMQ预定区域唤醒预定消息时,它将被转发到节流队列T
  • 消费者Ct使用第三方组件(通过TCP连接)处理来自T的消息

当P产生即时处理的消息时(即没有时间窗口),即使有大量消息(1M或更多),系统也能很好地运行:监视队列,我们​​可以看到它们几乎是空的(没有消息保持待处理状态)任何队列)。

当P生成用于延迟处理的消息时(即,使用时间窗口),我们会看到以下行为:

  • 我们在所有队列(Q和S)中都有待处理的消息,而我们希望它们只在队列S上待处理
  • 当S中调度的消息唤醒时,它们会移动到T队列:根据限制配置处理这些消息(1K消息/秒)
  • Q和S中仍然未决的消息移动到T(大约50条消息/秒)
  • 如果我们在处理完所有珍贵的消息(再次使用生产者P)之后尝试第二轮消息(没有时间窗口),我们仍然会发送消息到50条消息/秒,即使在在这种情况下,我们并未使用预定区域

问题摘要

  • ActiveMQ版本:5.9.0(配置3GB最大内存限制)
  • 骆驼版:2.15.1
  • Spring版本:4.1.3.RELEASE
  • 1条消息的平均维度:4.5KiB
  • 关键路线:
    • Q - &gt; S(预定区域) - &gt; T
    • Q - &gt; T (在使用预定区域后)
  • 不使用调度程序:在1M消息中,我们可以轻松处理1K消息/秒(限制取决于Camel限制队列)
  • 使用调度程序:在1M消息中,我们处理50条消息/秒
  • 监控CPU和内存使用情况,我们无法发现任何问题:占CPU使用率的2%到5%,我们永远不会出现内存不足(Java GC似乎也能正常工作)
  • 硬件(基于VMWare虚拟化):
    • CPU:24个vCPU映射到24个真正的“Intel(R)Xeon(R)CPU E5-2680 v3 @ 2.50GHz”CPU
    • Ram:31744MB

欢呼并提前感谢您的帮助,

性爱

1 个答案:

答案 0 :(得分:0)

5.4版的ActiveMQ在ActiveMQ消息代理activemq.apache.org/delay-and-schedule-message-delivery.html

中内置了一个可选的持久性调度程序

为了提高效果,请尝试将以下代码添加到brokerURL

上的ActiveMQConnectionFactory

例如:

ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616?jms.copyMessageOnSend=false&jms.dispatchAsync=true&jms.useAsyncSend=true");

看看

http://activemq.apache.org/connection-configuration-uri.html http://activemq.apache.org/performance-tuning.html