我一直在考虑将Mosquitto用作家庭物联网网络的 MQTT 消息代理,但我担心该代理可能是单点故障,如果发生故障可能会导致我的整个网络瘫痪,因为所有消息都必须通过如果代理因任何原因(例如意外拔出、硬件故障等)脱机,则无法传输任何消息。
是否可以使用安装了 Mosquitto 的多个代理来提高网络的可靠性?如果可能,使用多个代理是否有任何缺点/显着的开销?
我一直在考虑将Mosquitto用作家庭物联网网络的 MQTT 消息代理,但我担心该代理可能是单点故障,如果发生故障可能会导致我的整个网络瘫痪,因为所有消息都必须通过如果代理因任何原因(例如意外拔出、硬件故障等)脱机,则无法传输任何消息。
是否可以使用安装了 Mosquitto 的多个代理来提高网络的可靠性?如果可能,使用多个代理是否有任何缺点/显着的开销?
是的,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());
问题是,您必须管理重复项,以防在其他代理开始发送消息或警告客户端时发生回退。
可能有几种可能性,例如每个经纪人相互订阅并设置最后的遗嘱和遗嘱来警告他们自己和他们的客户将会发生回退!