Spring 引导框架中使用 Apache Camel 的 ActiveMQ 生产者的性能设置
Performance settings for ActiveMQ producer using Apache Camel in Spring boot framework
我们有一个 spring 引导应用程序,我们使用 apache camel 作为消息处理框架。我们正在努力优化我们的应用程序设置,以使 ActiveMQ 队列上的消息入队速度更快,这些消息由队列另一端的 Logstash 作为消费者接收。
文档分散在很多地方,可用的配置太多。
例如,camel link for spring boot specifies 102 options. Similarly, the activemq apache camel link 详细介绍了这些。
这是我们目前配置的:
Application.properties:
################################################
# Spring Active MQ
################################################
spring.activemq.broker-url=tcp://localhost:61616
spring.activemq.packages.trust-all=true
spring.activemq.user=admin
spring.activemq.password=admin
Apache 骆驼
.to("activemq:queue:"dataQueue"?messageConverter=#queueMessageConverter");
问题:
1 - 我们怀疑我们必须使用 poolConnectionFactory 而不是默认的 Spring JMS 模板 bean,它以某种方式自动获取。
2 - 我们还希望进程是异步的。我们只想将消息放入队列,不想等待来自 activemq 的任何 ACK 或做任何重试或其他事情。
3 - 我们只想在队列已满时等待重试。
4 - 我们应该在哪里设置 ActiveMq 的大小?而且 activemq 正在将东西放入死信队列以防没有消费者可用?我们想覆盖该行为并希望将消息保留在那里。 (这是否必须在 Activemq 中配置而不是在我们的 app/apache camel 中配置)
更新
经过更多调查并根据反馈,我们暂时解决了这个问题。注意:这不涉及重试,因为我们将尝试答案中建议的选项。
对于 Seda 队列:
制作人:
.to("seda:somequeue?waitForTaskToComplete=Never");
消费者:
.from("seda:somequeue?concurrentConsumers=20");
活跃的 MQ:
.to("activemq:queue:dataQueue?disableReplyTo=true);
Application.Properties:
#Enable poolconnection factory
spring.activemq.pool.enabled=true
spring.activemq.pool.blockIfFull=true
spring.activemq.pool.max-connections=50
是的,您需要使用 pooledConnectionFactory。特别是使用 Camel+Spring 引导。或者看看使用 camel-sjms 组件。罪魁祸首是 Spring 的 JMSTemplate。超高延迟。
发送NON_PERSISTENT和AUTO_ACK,同时在连接工厂上开启sendAsync
您需要在路由中捕获 javax.jms.ResourceAllocationException,以便在 Producer Flow Control 启动时(即队列或代理已满)进行重试
ActiveMQ 根据字节而不是消息计数来调整大小。请参阅 Producer Flow Control docs and Per-Destination Policies 策略中的 SystemUsage 设置以根据字节数限制队列大小。
我们有一个 spring 引导应用程序,我们使用 apache camel 作为消息处理框架。我们正在努力优化我们的应用程序设置,以使 ActiveMQ 队列上的消息入队速度更快,这些消息由队列另一端的 Logstash 作为消费者接收。
文档分散在很多地方,可用的配置太多。
例如,camel link for spring boot specifies 102 options. Similarly, the activemq apache camel link 详细介绍了这些。
这是我们目前配置的:
Application.properties:
################################################
# Spring Active MQ
################################################
spring.activemq.broker-url=tcp://localhost:61616
spring.activemq.packages.trust-all=true
spring.activemq.user=admin
spring.activemq.password=admin
Apache 骆驼
.to("activemq:queue:"dataQueue"?messageConverter=#queueMessageConverter");
问题:
1 - 我们怀疑我们必须使用 poolConnectionFactory 而不是默认的 Spring JMS 模板 bean,它以某种方式自动获取。
2 - 我们还希望进程是异步的。我们只想将消息放入队列,不想等待来自 activemq 的任何 ACK 或做任何重试或其他事情。
3 - 我们只想在队列已满时等待重试。
4 - 我们应该在哪里设置 ActiveMq 的大小?而且 activemq 正在将东西放入死信队列以防没有消费者可用?我们想覆盖该行为并希望将消息保留在那里。 (这是否必须在 Activemq 中配置而不是在我们的 app/apache camel 中配置)
更新 经过更多调查并根据反馈,我们暂时解决了这个问题。注意:这不涉及重试,因为我们将尝试答案中建议的选项。
对于 Seda 队列:
制作人:
.to("seda:somequeue?waitForTaskToComplete=Never");
消费者:
.from("seda:somequeue?concurrentConsumers=20");
活跃的 MQ:
.to("activemq:queue:dataQueue?disableReplyTo=true);
Application.Properties:
#Enable poolconnection factory
spring.activemq.pool.enabled=true
spring.activemq.pool.blockIfFull=true
spring.activemq.pool.max-connections=50
是的,您需要使用 pooledConnectionFactory。特别是使用 Camel+Spring 引导。或者看看使用 camel-sjms 组件。罪魁祸首是 Spring 的 JMSTemplate。超高延迟。
发送NON_PERSISTENT和AUTO_ACK,同时在连接工厂上开启sendAsync
您需要在路由中捕获 javax.jms.ResourceAllocationException,以便在 Producer Flow Control 启动时(即队列或代理已满)进行重试
ActiveMQ 根据字节而不是消息计数来调整大小。请参阅 Producer Flow Control docs and Per-Destination Policies 策略中的 SystemUsage 设置以根据字节数限制队列大小。