ActiveMQ Artemis复制模式消息发布性能低下,求优化方案
ActiveMQ Artemis复制模式性能优化问题
环境信息
- 操作系统:Ubuntu 20.04 LTS 64位
- JDK:OpenJDK 11.0.12
- ActiveMQ:ActiveMQ Artemis 2.27.1(亦测试过2.25.0版本)
主节点(master)broker.xml关键配置
<ha-policy> <replication> <master> <check-for-live-server>true</check-for-live-server> </master> </replication> </ha-policy> <cluster-user>alt_cluster</cluster-user> <cluster-password>alt_cluster</cluster-password> <broadcast-groups> <broadcast-group name="bg-group1"> <group-address>231.7.7.6</group-address> <group-port>9876</group-port> <broadcast-period>5000</broadcast-period> <connector-ref>artemis</connector-ref> </broadcast-group> </broadcast-groups> <discovery-groups> <discovery-group name="dg-group1"> <group-address>231.7.7.6</group-address> <group-port>9876</group-port> <refresh-timeout>10000</refresh-timeout> </discovery-group> </discovery-groups> <cluster-connections> <cluster-connection name="my-cluster"> <connector-ref>artemis</connector-ref> <message-load-balancing>ON_DEMAND</message-load-balancing> <max-hops>1</max-hops> <discovery-group-ref discovery-group-name="dg-group1"/> </cluster-connection> </cluster-connections>
从节点(slave)broker.xml关键配置
<ha-policy> <replication> <slave> <allow-failback>true</allow-failback> </slave> </replication> </ha-policy> <cluster-user>alt_cluster</cluster-user> <cluster-password>alt_cluster</cluster-password> <broadcast-groups> <broadcast-group name="bg-group1"> <group-address>231.7.7.6</group-address> <group-port>9876</group-port> <broadcast-period>5000</broadcast-period> <connector-ref>artemis</connector-ref> </broadcast-group> </broadcast-groups> <discovery-groups> <discovery-group name="dg-group1"> <group-address>231.7.7.6</group-address> <group-port>9876</group-port> <refresh-timeout>10000</refresh-timeout> </discovery-group> </discovery-groups> <cluster-connections> <cluster-connection name="my-cluster"> <connector-ref>artemis</connector-ref> <message-load-balancing>ON_DEMAND</message-load-balancing> <max-hops>1</max-hops> <discovery-group-ref discovery-group-name="dg-group1"/> </cluster-connection> </cluster-connections>
测试场景与结果
使用Apache NIFI作为消息生产者,PublishJMS处理器并发任务数初始设为10:
- 场景1(黄色区域):集群复制模式,主从节点均运行,消息发布平均速度约60000条/分钟;将并发任务数提升至40后,速度仅小幅提升至65000-70000条/分钟。
- 场景2(绿色区域):集群复制模式,仅主节点运行,消息发布平均速度约130000条/分钟。
- 场景3(红色区域):无复制的集群模式,两个主节点运行,消息发布平均速度约130000条/分钟。
优化方案
1. 调整复制同步策略
默认同步复制模式下,主节点需等待从节点确认消息接收后才会向客户端返回确认,这是核心性能瓶颈。可做如下调整:
- 启用异步复制:主节点无需等待从节点确认即可返回,大幅提升吞吐量,但需注意异步模式下主节点宕机可能丢失少量未复制消息,需结合业务容忍度选择。在主节点
ha-policy的master节点中添加:
<ha-policy> <replication> <master> <check-for-live-server>true</check-for-live-server> <replication-sync-mode>ASYNC</replication-sync-mode> </master> </replication> </ha-policy>
- 配置批量复制:让主节点积累一定数量或时间的消息后批量发送给从节点,减少网络交互次数。在
broker.xml的core节点下添加:
<replication-batch-size>1000</replication-batch-size> <replication-batch-timeout>50</replication-batch-timeout>
2. 优化网络与集群连接
- 使用高效网络连接器:Linux环境下改用
netty-epoll提升网络性能,修改connectors配置:
<connector name="artemis">tcp://0.0.0.0:61616?tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;useEpoll=true</connector>
- 调整集群连接线程池:增大线程池上限,优化集群通信的线程资源,在
cluster-connection中添加:
<cluster-connection name="my-cluster"> <!-- 原有配置保留 --> <thread-pool-max-size>20</thread-pool-max-size> <call-timeout>30000</call-timeout> </cluster-connection>
3. 优化生产者端配置
- 启用批量发送:在NIFI的PublishJMS处理器中设置合理的
Batch Size,同时在ActiveMQ连接URL中添加jms.batch.count=1000参数,让客户端积累多条消息后一次性发送,减少JMS交互开销。 - 调整确认模式:如果业务允许,使用
DUPS_OK_ACKNOWLEDGE确认模式,降低确认开销;或采用事务批量提交,比如每1000条消息提交一次事务,减少事务提交次数。
4. 优化Broker内核参数
- 调整持久化与页缓存:增大页缓存大小、日志缓冲区,提升持久化性能,在
broker.xml的core节点下添加:
<page-size-bytes>10485760</page-size-bytes> <journal-buffer-size>20971520</journal-buffer-size> <max-disk-usage>90</max-disk-usage>
- 调整线程池:增大核心线程池和最大线程池大小,提升Broker处理消息的并发能力:
<core-thread-pool-size>20</core-thread-pool-size> <max-thread-pool-size>50</max-thread-pool-size>
5. 系统与硬件优化
- 确保主从节点处于同一低延迟网络环境(如同一机房内网),避免跨机房高延迟拖慢复制速度。
- 调整Linux系统TCP参数:增大TCP缓冲区,编辑
/etc/sysctl.conf添加以下配置,执行sysctl -p生效:
net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.ipv4.tcp_rmem = 4096 87380 16777216 net.ipv4.tcp_wmem = 4096 65536 16777216
内容的提问来源于stack exchange,提问作者wureka
相关产品推荐
相关产品推荐

