Answers:
是的,Mosquitto确实支持多个经纪人。
Mosquitto使用MQTT桥来连接多个代理,从而在这些mosquitto代理之间路由消息。这样,可以在主代理与后备系统之间建立桥梁。避免创建循环。如果两个代理都运行,则您的客户端将发布到主代理,然后主代理将主题发布给每个用户以及包括桥接辅助代理在内的所有订户。如果主服务器失败,则您的客户端会记录(“连接已拒绝”,“服务器不可用”),并且可以回退以直接发布到辅助服务器。(我不确定如何反过来解决它。)由于您不希望客户端不友好地断开连接,所以我认为“最后的遗嘱”在这里不适用(该功能通常用于通知经纪人代表断开连接的客户端)。
但是,这篇文章列出了这种方法的缺点,特别是在可伸缩性和可用性方面:
- 如果将所有消息转发到其他网桥,则网桥路由机制无法很好地扩展
- 如果在网桥之间使用QoS 2,则网桥之间的通信开销非常大(如果要在连接到不同网桥的客户端之间传播消息,则需要这样做)
- 没有故障转移和高可用性。如果代理桥崩溃,则消息可能会丢失
- MQTT客户端无法迁移到其他桥节点。MQTT会话不会跨网桥复制,因此,如果您使用MQTT持久会话,则将丢失所有排队的消息和订阅。
在.NET中,该实现允许将一个客户端连接到一个代理,所以我要说为什么不...
MqttClient mqtt;
string broker = ini.getData("MQTT", "hostname");
mqtt = new MqttClient(broker);
mqtt.MqttMsgPublishReceived += mqtt_received;
mqtt.Connect(Guid.NewGuid().ToString());
事实是,当另一个代理开始发送消息或警告客户端时发生回退时,您必须管理重复项。
可能有多种可能性,例如每个经纪人彼此订阅并设置最后遗嘱和遗嘱来警告自己和他们的客户将发生回退!