Mosquittoは複数のブローカーをサポートできますか?


20

私が検討してきたMosquittoをホームのIoTネットワーク用のMQTTメッセージ・ブローカーのために、私は、すべてのメッセージが通過する必要があるため、ブローカーは、それが失敗した場合、私のネットワーク全体をダウンさせる可能性が単一障害点となる可能性を懸念していますブローカーが何らかの理由でオフラインになった場合(偶発的なプラグの抜き取り、ハードウェア障害など)、ブローカーはまったく送信できません。

Mosquittoをインストールした状態で複数のブローカーを使用して、ネットワークの信頼性を向上させることは可能でしょうか?可能であれば、複数のブローカーを使用することに不利な点や重要なオーバーヘッドはありますか?

回答:


12

はい、Mosquittoは複数のブローカーをサポートしています。

MosquittoはMQTT Bridgesを使用して複数のブローカーを接続し、これらのmosquittoブローカー間でメッセージをルーティングします。このようにして、プライマリブローカーとフォールバックシステムの間のブリッジを確立できます。ただし、ループの作成は避けてください。両方のブローカーがクライアントを実行する場合、クライアントはプライマリブローカーに発行し、ブリッジはセカンダリブローカーを含む各サブスクライバーにトピックを発行します。プライマリに障害が発生した場合、クライアントは(接続拒否、サーバーは利用不可)と記録し、フォールバックしてセカンダリに直接公開できます。(他の方法でそれを修正する方法はまだわかりません。)クライアントが不意に切断することを期待していないので、「最後の遺言」はここには当てはまらないと思います(ブローカーに通知するために使用されます)切断されたクライアントに代わって)。

ただし、この投稿では、特にスケーラビリティと可用性に関するこのアプローチの欠点をリストしています。

  • すべてのメッセージを他のブリッジに転送する場合、ブリッジルーティングメカニズムはうまくスケールしません。
  • ブリッジ間でQoS 2を使用している場合、ブリッジ間の通信オーバーヘッドは非常に大きくなります(異なるブリッジに接続されているクライアント間でメッセージを伝播する場合に行う必要があります)
  • フェイルオーバーと高可用性はありません。ブローカーブリッジがクラッシュすると、メッセージが失われる可能性があります
  • MQTTクライアントを他のブリッジノードに移行することはできません。MQTTセッションはブリッジ間でレプリケートされないため、MQTT永続セッションを使用している場合、キューに入れられたメッセージとサブスクリプションはすべて失われます。

10

.NETでは、実装により1つのクライアントを1つのブローカーに接続できます。

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

事は、あるあなたは、重複を管理しなければならない他のブローカーがメッセージの送信を開始、またはクライアントを警告する際にフォールバックの場合。

各ブローカーが互いにサブスクライブし、フォールバックが発生することを自分自身とクライアントに警告するように最後の遺言と遺言を設定するなど、いくつかの可能性があります!


ブローカーはどのようにサブスクライブすることができますか?
ベンスカウリック16

1
ブローカーのサーバーにネストされたクライアントを考えていました。
グーファライト16

@Goufalite、これはMQTT全般に本当に役立ちます、ありがとう。質問で説明したブローカーであるMosquittoについて、もう知っているでしょうか?
Aurora0001

これはMQTTについて私が知っている最低のことです(IoT SEに来る前にHiveMQのような他のブローカーが存在することに気づきませんでした)。他に何を知りたいですか?実装を意味しますか?
グーファライト16

@Goufaliteは、Mosquitto自体に複数のブローカーを並行して実行する方法があるかどうかに興味がありました。Mosquittoでそれを行う方法を提案したり、ドキュメントをリンクしたりすることができれば、それは素晴らしいことです。
Aurora0001
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.