Mosquitto可以支持多个经纪人吗?


20

我一直在考虑将Mosquitto用作家庭物联网网络的MQTT消息代理,但是我担心该代理可能是单点故障,如果发生故障,可能会破坏我的整个网络,因为所有消息都必须通过代理,并且如果代理出于任何原因(例如意外拔出,硬件故障等)脱机,则根本无法传输任何消息。

可以使用安装了Mosquitto的多个代理来提高网络的可靠性吗?如果有可能,使用多个代理是否有任何不利/大量的开销?

Answers:


12

是的,Mosquitto确实支持多个经纪人。

Mosquitto使用MQTT桥来连接多个代理,从而在这些mosquitto代理之间路由消息。这样,可以在主代理与后备系统之间建立桥梁。避免创建循环。如果两个代理都运行,则您的客户端将发布到主代理,然后主代理将主题发布给每个用户以及包括桥接辅助代理在内的所有订户。如果主服务器失败,则您的客户端会记录(“连接已拒绝”,“服务器不可用”),并且可以回退以直接发布到辅助服务器。(我不确定如何反过来解决它。)由于您不希望客户端不友好地断开连接,所以我认为“最后的遗嘱”在这里不适用(该功能通常用于通知经纪人代表断开连接的客户端)。

但是,这篇文章列出了这种方法的缺点,特别是在可伸缩性和可用性方面:

  • 如果将所有消息转发到其他网桥,则网桥路由机制无法很好地扩展
  • 如果在网桥之间使用QoS 2,则网桥之间的通信开销非常大(如果要在连接到不同网桥的客户端之间传播消息,则需要这样做)
  • 没有故障转移和高可用性。如果代理桥崩溃,则消息可能会丢失
  • MQTT客户端无法迁移到其他桥节点。MQTT会话不会跨网桥复制,因此,如果您使用MQTT持久会话,则将丢失所有排队的消息和订阅。

10

在.NET中,该实现允许将一个客户端连接到一个代理,所以我要说为什么不...

MqttClient mqtt;
string broker = ini.getData("MQTT", "hostname");
mqtt = new MqttClient(broker);
mqtt.MqttMsgPublishReceived += mqtt_received;
mqtt.Connect(Guid.NewGuid().ToString());

事实是,当另一个代理开始发送消息或警告客户端时发生回退时,您必须管理重复项

可能有多种可能性,例如每个经纪人彼此订阅并设置最后遗嘱和遗嘱来警告自己和他们的客户将发生回退!


经纪人如何订阅或更喜欢连接到另一个经纪人?
Bence Kaulics '16

1
我在想一个嵌套在代理服务器上的客户端。
Goufalite

@Goufalite,总体而言,这对于MQTT确实非常有用,谢谢。您是否会进一步了解我在问题中讨论过的经纪人Mosquitto
Aurora0001

这是我对MQTT的最低了解(在加入IoT SE之前,我没有意识到还有其他经纪人,例如HiveMQ)。您还想知道什么?你是说实施?
Goufalite

@Goufalite只是想知道Mosquitto本身是否可以并行运行多个代理。如果您可以建议使用Mosquitto或链接文档的方法,那就太好了。
Aurora0001
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.