ActiveMQ 的负载均衡和高可用(High Availability, HA)通常不是通过单一组件实现的,而是需要结合网络拓扑结构、代理集群模式以及外部负载均衡器共同构建。
以下是构建 ActiveMQ 负载均衡与高可用架构的主流方案及详细解析:
核心架构模式
主从复制模式(Master-Slave) 解决高可用
这是最基础的高可用方案,确保当一台 Broker 宕机时,另一台能立即接管服务,保证数据不丢失。
共享文件系统(Shared File System):
- 原理:所有 Broker 实例挂载同一个 NFS 或共享存储,只有 Master 节点可以读写数据,Slave 节点只读并监控 Master。
- 优点:配置简单,数据一致性最好。
- 缺点:存在单点故障(NFS 本身),性能受限于共享存储 I/O。
- 适用场景:中小规模集群,对数据一致性要求极高。
ZooKeeper + Master-Slave:
- 原理:利用 ZooKeeper 进行选举,Broker 启动时竞争获取锁,获得锁的成为 Master,其余为 Slave。
- 优点:去中心化选举,无单点故障,支持多活(部分场景)。
- 缺点:依赖 ZooKeeper 集群的稳定性。
- 适用场景:大规模集群,推荐生产环境使用。
KahaDB / LevelDB 复制:
ActiveMQ 5.x 主要使用 KahaDB,5.15+ 引入 LevelDB,LevelDB 支持多节点复制,但通常仍建议配合外部负载均衡使用。
⚠️ 注意:主从模式下,同一时刻只有一个 Master 对外提供服务,因此主从本身不提供负载均衡能力,只提供故障转移。
网络桥接模式(Network of Brokers) 解决负载均衡与扩展
这是 ActiveMQ 特有的功能,用于将多个独立的 Broker 连接成一个逻辑集群,实现消息的路由和负载均衡。
工作原理:
- 多个 Broker 之间通过
networkConnector互相连接。 - 支持两种拓扑:

P2P(点对点)
:Broker 两两连接,形成网状结构。- Hub-and-Spoke(中心-分支):一个中心 Broker 连接多个边缘 Broker。
- 动态发现:支持静态配置或基于 ZooKeeper 的动态发现。
- 多个 Broker 之间通过
负载均衡机制:
- 消费者负载均衡:当多个消费者连接到不同的 Broker,且订阅相同 Topic 时,ActiveMQ 会根据网络桥接策略将消息分发到不同 Broker,再由消费者消费。
- 生产者负载均衡:生产者可以轮询连接不同的 Broker,消息会被自动路由到拥有该 Queue/Topic 的 Broker。
优点:
- 天然支持水平扩展。
- 支持跨机房部署。
- 故障隔离:某个 Broker 宕机,不影响其他 Broker 的服务。
缺点:
- 配置复杂,容易出现消息重复或乱序(需仔细设计)。
- 网络开销较大。
外部负载均衡器集成(推荐方案)
为了更灵活地实现负载均衡和高可用,强烈建议在 ActiveMQ Broker 集群前端部署一个外部负载均衡器。
架构示意
[Client] --> [Nginx / HAProxy / F5] --> [Broker A]
--> [Broker B]
--> [Broker C] 负载均衡策略
- TCP 层负载均衡:
- 使用 Nginx 或 HAProxy 的 TCP 模式(
stream模块)。 - 支持
least_conn(最少连接)、round_robin(轮询)等算法。 - 健康检查:定期探测 Broker 的 TCP 端口(默认 61616)是否存活。
- 使用 Nginx 或 HAProxy 的 TCP 模式(
- HTTP 层负载均衡:
如果使用 ActiveMQ 的 REST API 或 Web 控制台,可使用 Nginx 的 HTTP 负载均衡。
优点
- 解耦:客户端无需感知后端 Broker 的变化。
- 灵活:可随时添加/移除 Broker,无需修改客户端配置。
- 高性能:Nginx/HAProxy 经过高度优化,处理连接能力强。
- 支持多种协议

:可统一暴露 STOMP、AMQP、OpenWire 等协议端口。
综合最佳实践方案
方案 A:中小型集群(简单高可用 + 简单负载均衡)
- 部署 3 个 ActiveMQ Broker。
- 配置 ZooKeeper 主从:确保数据高可用,任意一台宕机,Master 自动切换。
- 前端使用 Nginx/HAProxy:
- 配置 TCP 负载均衡,轮询分发客户端连接。
- 配置健康检查,自动剔除故障节点。
- 客户端:使用 ActiveMQ 的 Failover Transport 协议,如:
failover:(tcp://broker1:61616,tcp://broker2:61616,tcp://broker3:61616)?initialReconnectDelay=100这样即使负载均衡器故障,客户端也能直连备用 Broker。
方案 B:大型分布式集群(网络桥接 + 外部负载均衡)
- 部署多个 ActiveMQ 集群,每个集群内部使用 ZooKeeper 主从。
- 配置 Network of Brokers:
- 不同集群之间通过
networkConnector连接。 - 使用 ZooKeeper 动态发现机制。
- 不同集群之间通过
- 前端使用 LVS + Keepalived 或云厂商 SLB:
实现更高吞吐量的负载均衡。
- 客户端:同样使用 Failover 协议,但指向负载均衡器 VIP 或 DNS 地址。
关键配置示例
ZooKeeper 主从配置(activemq.xml)
<persistenceAdapter>
<kahaDB directory="${activemq.data}/kahadb"/>
</persistenceAdapter>
<!-- 启用 ZooKeeper 主从 -->
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<broker brokerName="broker1" useJmx="true" persistent="true">
<networkConnectors>
<!-- 可选:配置网络桥接 -->
</networkConnectors>
<plugins>
<simpleAuthenticationPlugin>
<users>
<authenticationUser username="admin" password="admin" groups="admins"/>
</users>
</simpleAuthenticationPlugin>
</plugins>
</broker> 
Nginx TCP 负载均衡配置
stream {
upstream activemq_cluster {
least_conn; # 最少连接算法
server broker1:61616 weight=3;
server broker2:61616 weight=2;
server broker3:61616 weight=1;
}
server {
listen 61616; # 对外暴露端口
proxy_timeout 3s;
proxy_pass activemq_cluster;
}
} 注意事项与常见问题
消息重复与乱序:
- 在主从切换或网络分区时,可能出现消息重复,建议客户端实现幂等性消费。
- 在网络桥接中,确保
duplex="true"和合理的networkTTL避免环路。
JMX 监控:
启用 JMX 并集成 Prometheus + Grafana,实时监控队列长度、消费者数量、Broker 状态。
客户端连接池:
使用连接池(如 HikariCP 类似的 JMS 连接池)避免频繁创建/销毁连接,提升性能。
协议选择:
- OpenWire:ActiveMQ 原生协议,性能最高,但仅适用于 Java 客户端。
- STOMP/AMQP:跨语言支持好,适合异构系统。
替代方案考虑:
- 如果业务规模极大,建议评估 Apache Kafka 或 RabbitMQ,它们在大规模分布式场景下有更成熟的生态和更好的水平扩展能力,ActiveMQ 更适合中小规模、对事务一致性要求高的场景。
| 目标 | 推荐方案 |
|---|---|
| 高可用 | ZooKeeper + Master-Slave 主从复制 |
| 负载均衡 | 前端 Nginx/HAProxy TCP 负载均衡 |
| 扩展性 | Network of Brokers(网络桥接) |
| 客户端容错 | Failover Transport 协议 |
最佳实践:ZooKeeper 主从 + Nginx 负载均衡 + 客户端 Failover 协议 是目前 ActiveMQ 生产环境中最稳定、最常用的组合。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复