ActiveMQ Artemis多Broker的MQTT高可用与负载均衡连接方案咨询
ActiveMQ Artemis 多主备集群的MQTT连接方案选择
我部署了3个主Broker + 3个从Broker的ActiveMQ Artemis集群,已经通过Spring Boot(JMS)和Artemis CLI实现了集群连接,配置示例如下:
Spring Boot 配置示例
spring: artemis: mode: native broker-url: (<maste1>,<maste2>,<maste3>,<slave1>,<slave2>,<slave3>)?ha=true&retryInterval=1000&retryIntervalMultiplier=1.5&maxRetryInterval=60000&reconnectAttempts=1000 user: password:
Artemis CLI 命令示例
artemis producer --url "(<maste1>,<maste2>,<maste3>,<slave1>,<slave2>,<slave3>)?ha=true&retryInterval=1000&retryIntervalMultiplier=1.5&maxRetryInterval=60000&reconnectAttempts=1000" ...
现在遇到的问题是:MQTT客户端(如mqtt.fx、mqttx)仅支持配置单个主机名和端口,不确定该选择以下哪种方式实现MQTT连接的高可用与负载均衡:
- 方案一:将所有Broker地址提供给客户端,但后续增减Broker时需要更新客户端配置
- 方案二:使用代理服务器(如F5、Nginx)管理连接,但担心和Artemis自身的负载均衡功能冲突
两种方案的对比与建议
1. 直接向客户端提供所有Broker地址(MQTT 5.0 支持)
如果你的MQTT客户端支持MQTT 5.0协议,可以利用MQTT 5.0的Server Reference特性(或部分客户端的自定义多地址配置),把所有Broker的地址列表提供给客户端。客户端会自动尝试连接列表中的节点,实现故障转移。
- 优势:无需额外部署代理,直接利用Artemis自身的HA与负载均衡能力,减少中间层复杂度
- 劣势:
- 仅支持MQTT 5.0客户端,老版本MQTT 3.x客户端无法兼容
- 集群节点增减时,必须同步更新所有客户端的地址配置,维护成本高,不适用于大规模客户端场景
2. 使用代理服务器做统一入口
这是生产环境更推荐的方案,尤其是客户端数量多或采用MQTT 3.x协议的场景。代理服务器作为统一连接入口,负责负载均衡和故障转移,客户端只需配置代理的地址即可。
- 关于负载均衡冲突的疑问:
Artemis自身的负载均衡是针对集群内部的消息路由与客户端连接分发,而代理服务器的负载均衡是在TCP连接层面做分发,两者并不冲突。代理负责把客户端连接均匀转发到集群的主Broker节点(从Broker通常仅用于故障接管,不处理正常连接),Artemis内部再根据自身的负载策略优化消息处理。 - 优势:
- 兼容所有MQTT版本客户端,无需修改客户端配置
- 集群节点增减时,只需更新代理配置,客户端无感知,维护成本低
- 代理可额外提供SSL终止、流量管控、访问控制等功能,增强集群安全性与可控性
- 推荐代理选型:
- F5/Nginx Plus:适合企业级场景,提供成熟的TCP负载均衡、健康检查功能,能自动剔除故障节点
- HAProxy:轻量开源的TCP负载均衡工具,配置简单,适合中小规模集群
- Artemis内置代理:ActiveMQ Artemis提供内置的MQTT代理模块,可部署独立代理节点作为连接入口,与集群原生集成度更高
最终建议
- 若客户端均为MQTT 5.0且数量较少,可尝试直接配置多地址列表;
- 生产环境优先选择代理服务器方案,既能兼容所有客户端,又能降低集群维护成本,同时结合Artemis自身的HA与负载均衡能力,实现完整的高可用架构。
内容的提问来源于stack exchange,提问作者Erkan Solmaz
相关产品推荐
相关产品推荐

