Abonnieren Sie nicht # - wie werden alle Nachrichten mit Mosquitto in die Datenbank geschrieben?


16

HiveMQs Blog listet unter "Best Practices" auf, dass der mehrstufige Platzhalter nicht abonniert wird, wenn versucht wird, alle Nachrichten in eine Datenbank zu sichern . Sie behaupten, dass der abonnierende Client möglicherweise nicht in der Lage ist, mit einer hohen Nachrichtenlast Schritt zu halten, und schlagen stattdessen vor, ein Broker-Plugin zu verwenden, um sich direkt in den Nachrichtenstrom einzuklinken.

Manchmal ist es notwendig, alle Nachrichten zu abonnieren, die über den Broker übertragen werden, zum Beispiel, wenn alle in einer Datenbank gespeichert werden. Dies sollte nicht mithilfe eines MQTT-Clients und Abonnieren des mehrstufigen Platzhalters erfolgen. Der Grund dafür ist, dass der abonnierende Client häufig nicht in der Lage ist, die anstehenden Nachrichtenmengen zu verarbeiten. Besonders wenn Sie einen massiven Durchsatz haben. Unsere empfohlene Lösung besteht darin, eine Erweiterung im MQTT-Broker zu implementieren. Mit dem Plug-in-System von HiveMQ können Sie sich in das Verhalten von HiveMQ einbinden und eine asynchrone Routine hinzufügen, um jede eingehende Nachricht zu verarbeiten und in einer Datenbank zu speichern.

Gibt es auch

  • ein ähnliches System (Erweiterung / Plugin) für den Moskito-Broker,
  • eine andere empfohlene Methode, die mit Mücken arbeitet, oder
  • vernünftige Beweise dafür, dass dieser Ansatz überhaupt nicht notwendig ist, dh dass ein Kunde, der sich anmeldet, das auch #kann?

/programming//q/31584613/3984613 behandelt diese Frage nicht vollständig.

Antworten:


12

ein ähnliches System (Erweiterung / Plugin) für den Moskito-Broker

Soweit ich weiß, gibt es kein Plugin / Erweiterung für Moskito-Broker (zumindest kein OpenSource-Broker)

eine andere empfohlene Methode, die mit Mücken arbeitet

Nach meiner Erfahrung mit Mosquitto Broker und AWS IoT können Sie "#" einfach direkt abonnieren.

Angemessene Beweise

Nachdem ich mir diese Frage angesehen hatte, war ich etwas neugierig, die Durchsatzgrenzen zu kennen und herauszufinden, ob ein Erweiterungssystem erforderlich ist. Also habe ich folgendes eingerichtet:

  • 100 AWS Lambda-Funktionen, die als virtuelle Endgeräte fungieren, um zufällige Daten an das Gateway zu senden (EC2-Instanz t2.nano500 MB RAM)
  • Alle 60 Sekunden werden Funktionen ausgelöst, um Daten im Gateway zu verschiedenen Themen zu veröffentlichen (lambdatoec2 / {VariableTopicNumberFrom1-100}
  • Auf der EC2-Instanz wird Mosquitto 1.4.10 ausgeführt

Ab sofort sehe ich, dass es kein Problem gibt, # ohne ein Erweiterungssystem zu abonnieren. Aber auch hier muss ich noch einige Randfall-Szenarien testen (ich werde die Antwort aktualisieren, sobald ich sie teste).


Die "richtige" Antwort lautet "Testen". Wenn nachgewiesen werden kann, dass die Leistung Ihres Systems durch das Hinzufügen eines Abonnenten zu # beeinträchtigt wird, konfigurieren Sie den Broker so, dass # keine Abonnements zugelassen werden. Ich habe diese Antwort positiv bewertet, weil @bravokeyl genau das getan hat.
John Deters

11

Diese Diskussion auf der openHAB-Mailingliste scheint darauf hinzudeuten , dass es kein Problem gibt #, alle Nachrichten als Abonnement zu verwenden:

Bei der Fehlerbehebung bei MQTT-Geräten kam mir der Gedanke, dass ich manchmal wünschte, ich könnte alle MQTT-Nachrichten sehen, die der Mosquitto-Broker sieht, anstatt zu einem bestimmten Thema. Gibt es eine Möglichkeit, dies zu tun?

Jemand hat diese Frage für Sie auf der Mosquitto-Liste beantwortet. Verwenden Sie einen Platzhalter. (#)

Diese Stapelüberlauf-Frage schlägt auch die gleiche Methode vor:

Durch das Abonnieren von # erhalten Sie ein Abonnement für alles außer für Themen, die mit einem $ beginnen (dies sind normalerweise ohnehin Kontrollthemen).

Es ist jedoch besser zu wissen, was Sie zuerst abonnieren, und zu beachten, dass bei einigen Brokerkonfigurationen das Abonnieren von # möglicherweise nicht explizit zulässig ist.

Wie von Bence Kaulics hervorgehoben , besagt die Spezifikation, dass #gilt:

Nicht normativer Kommentar

  • "#" Ist gültig und erhält jede Bewerbungsmeldung

Ehrlich gesagt, bezweifle ich, dass die ursprüngliche Behauptung überhaupt Sinn macht:

Der Grund dafür ist, dass der abonnierende Client häufig nicht in der Lage ist, die anstehenden Nachrichtenmengen zu verarbeiten.

Wenn dies der Fall ist, wie könnte der Broker die Nachrichten überhaupt behandeln? Solange Ihr Client ähnliche Leistungsmerkmale an den Broker hat, ich stark bezweifle , wäre es möglich , den Client zu überwältigen, weil das Niveau des Verkehrs auch den Broker und Ursache überwältigen würde , dass zuerst zum Absturz bringen.

Zusammenfassend scheint die Behauptung von HiveMQ nicht durch viele Beweise aus anderen Quellen gestützt zu werden, und wenn Sie sich überlegen, was dies tatsächlich bedeuten würde, erscheint dies nicht besonders logisch.


10

Ich denke, es ist wichtig zu berücksichtigen, dass es für MQTT-Broker wie für jede Software viele verschiedene Anwendungsfälle gibt.

Das Verarbeiten von Chat-Nachrichten für eine Milliarde Benutzer (viele Benutzer, relativ niedrige Nachrichtenrate pro Benutzer) unterscheidet sich von einem System mit wenigen Clients, aber hoher Nachrichtenrate, und beide unterscheiden sich von einem Hausautomationssystem (wenige Clients, niedrige Nachrichtenrate). .

HiveMQ denkt über Anwendungen mit sehr hohen Client- / Nachrichtenraten nach. In diesem Fall übertrifft die Leistungsfähigkeit des Brokers mit ziemlicher Sicherheit die eines Clients bei weitem.

Wenn Sie sich für #Ihr Hausautomationssystem anmelden möchten, ist es sehr unwahrscheinlich, dass dies zu Problemen führt. Sie können auf jeden Fall überprüfen, ob der Broker übermäßig viel CPU verwendet.

Wie in den anderen Antworten erhalten Sie beim Abonnieren von #alle "normalen" Themen, also alles, was nicht mit a beginnt $. Ich interpretiere die Spezifikation so, dass jedes Thema, das mit beginnt, $ein ganz eigener Baum für sich ist. Sie müssten also abonnieren $SYS/#, $whatever/#um alles zu erhalten . Wahrscheinlich möchten Sie das für eine normale Anwendung sowieso nicht tun.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.