ActiveMQ 的高可用(High Availability, HA)和负载均衡(Load Balancing)通常不是通过单一组件实现的,而是通过架构设计和中间件组合来完成的,ActiveMQ 本身是一个单点服务的消息代理(Broker),因此要实现高可用和负载均衡,需要结合外部机制或采用集群模式。
以下是几种主流的 ActiveMQ 高可用与负载均衡方案,从简单到复杂排列:
ActiveMQ + 负载均衡器(推荐用于传统架构)
这是最常见、最稳定的方案,通过外部负载均衡器将客户端请求分发到多个 ActiveMQ 实例,并配置健康检查以实现故障转移。
架构组成
- 多个 ActiveMQ Broker 节点:每个节点独立运行,通常配置为共享存储(如 KahaDB 或 JDBC)或使用复制机制。
- 负载均衡器:如 Nginx、HAProxy、LVS 或云厂商的 SLB(Server Load Balancer)。
- 客户端:配置负载均衡器的 VIP(虚拟 IP)作为连接地址。
实现步骤
部署多个 ActiveMQ 实例:
- 安装 2 个或多个 ActiveMQ 服务。
- 确保它们监听不同的端口(如 61616, 61617, 61618)。
- 注意:如果使用共享存储(如 JDBC + MySQL),所有 Broker 必须指向同一个数据库,但需配置
networkConnector或确保事务一致性,更常见的做法是每个 Broker 独立存储,通过 ActiveMQ Network of Brokers 进行消息同步(见方案二)。
配置负载均衡器:
Nginx 示例(TCP 负载均衡):
stream { upstream activemq_cluster { server 192.168.1.10:61616; server 192.168.1.11:61616; server 192.168.1.12:61616; } server { listen 61616; proxy_pass activemq_cluster; # 可选:设置健康检查 # health_check interval=5 fail_timeout=10 max_fails=3; } }
HAProxy 示例:
frontend activemq_frontend bind :61616 default_backend activemq_backend backend activemq_backend balance roundrobin option tcp-check server broker1 192.168.1.10:61616 check server broker2 192.168.1.11:61616 check server broker3 192.168.1.12:61616 check
客户端配置:
- 客户端连接负载均衡器的 IP:Port(如
tcp://192.168.1.100:61616)。 - 启用客户端故障转移机制(Failover Transport),
failover:(tcp://192.168.1.10:61616,tcp://192.168.1.11:61616,tcp://192.168.1.12:61616)?initialReconnectDelay=100
- 客户端连接负载均衡器的 IP:Port(如
优点
- 架构清晰,易于理解和维护。
- 负载均衡器成熟稳定,支持多种算法(轮询、最少连接等)。
- 客户端只需连接一个地址。
缺点
- 存在单点故障风险(如果负载均衡器宕机),需对负载均衡器本身做高可用(如 Keepalived + HAProxy)。
- 消息在 Broker 之间同步可能有延迟(取决于是否使用共享存储或网络连接器)。
ActiveMQ Network of Brokers(集群模式)
ActiveMQ 原生支持“Broker 网络”功能,多个 Broker 可以相互连接,形成一个逻辑上的集群,消息可以在集群内自动路由和复制。
架构组成
- 多个 ActiveMQ Broker,通过
networkConnector相互连接。 - 外部负载均衡器(可选,用于分发客户端连接)。
配置示例(activemq.xml)
<broker brokerName="broker1" ...>
<networkConnectors>
<networkConnector uri="static:(tcp://broker2:61616,tcp://broker3:61616)"
duplex="true"
decreaseNetworkConsumerPriority="true"/>
</networkConnectors>
</broker> 工作原理

- 当生产者发送消息到 Broker1,如果消费者在 Broker2,Broker1 会通过
networkConnector将消息转发给 Broker2。 - 支持动态发现(Discovery Agent)和静态配置。
优点
- 原生支持,无需额外中间件。
- 消息自动路由,简化了应用逻辑。
缺点
- 性能瓶颈:网络连接器会消耗 CPU 和网络带宽,大规模集群时性能下降明显。
- 复杂度高:配置复杂,容易出现消息重复、丢失或顺序问题。
- 不推荐用于高吞吐场景:相比方案一,它在高负载下表现较差。
ActiveMQ Artemis(新一代推荐)
如果你正在新项目中使用 ActiveMQ,强烈建议迁移到 ActiveMQ Artemis,它是 ActiveMQ 的下一代版本,原生支持高可用和负载均衡。
架构组成
- 主从复制(Shared Store):多个节点共享同一存储(如 NFS、GFS2),主节点处理请求,从节点热备。
- 多主复制(Shared Nothing):每个节点独立存储,通过协议同步状态。
- 集群发现:使用 JGroups 或 UDP/TCP 广播自动发现集群节点。
高可用机制
- 主从故障转移:主节点宕机,从节点在秒级内接管,客户端无感知(配合 Failover Transport)。
- 负载均衡:客户端连接集群时,Artemis 可以自动将连接分发到不同节点。
优点
- 高性能,支持百万级消息吞吐。
- 原生高可用,配置相对简单。
- 兼容 ActiveMQ 协议(STOMP, MQTT, OpenWire 等)。
缺点
- 学习曲线较陡。
- 需要共享存储或复杂的网络配置(取决于复制模式)。
使用云托管服务(最简单)
如果使用 AWS、简米云、酷番云等云平台,直接使用其托管的 MQ 服务(如 AWS MQ for ActiveMQ、简米云消息队列 RocketMQ 版等)。

- 优点:无需运维,自动高可用,自动负载均衡。
- 缺点:成本较高,数据存储在云厂商。
总结与建议
| 方案 | 适用场景 | 复杂度 | 性能 | 推荐指数 |
|---|---|---|---|---|
| 负载均衡器 + 多 Broker | 现有 ActiveMQ 5.x 集群,追求稳定 | 中 | 高 | |
| Network of Brokers | 小规模集群,消息量不大 | 高 | 中 | |
| ActiveMQ Artemis | 新项目,高性能需求 | 中高 | 极高 | |
| 云托管服务 | 不想运维,预算充足 | 低 | 高 |
最佳实践建议
优先选择方案一(负载均衡器 + 多 Broker):
- 对于大多数企业级应用,这是最成熟、最可控的方案。
- 使用 HAProxy + Keepalived 实现负载均衡器的高可用。
- 客户端使用
failover传输协议,确保 Broker 宕机时自动重连。
避免使用 Network of Brokers 处理高吞吐:
它更适合小规模的、对实时性要求不高的场景。
考虑迁移到 Artemis:
如果项目允许,ActiveMQ Artemis 是更现代、更高效的替代方案。
监控与告警:
无论采用哪种方案,都必须部署监控(如 Prometheus + Grafana)来监控 Broker 状态、队列长度、消息积压等。
消息持久化:
确保所有 Broker 都配置了持久化存储(KahaDB 或 JDBC),防止重启后消息丢失。
通过以上方案,你可以构建一个高可用、负载均衡的 ActiveMQ 消息中间件系统。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复