Szenario
IoT-Gerät (derzeit IPv4-Gerät), das über TCP-Socket einmal pro Tag eine Nutzlast an einen Server sendet. Der Server hat eine öffentliche IP-Adresse, das Gerät befindet sich hinter einem Router / NAT. Ich werde ein Modul verwenden, das auf ESP8266 basiert (dh Olimex eins).
Ziel
Der Server sollte in der Lage sein, Daten an jeden Client zu senden, wann immer dies erforderlich ist. Ich bin nicht an einer direkten Client-zu-Client-Kommunikation interessiert (dh von meinem Smartphone aus mit einem Gerät verbunden), wie es das Lochern tun soll.
Sonstige Anforderungen
Die IoT-Geräte können bis zu mehreren Tausend wachsen. Ihre Internetverbindung wird von vielen 4G-fähigen Routern / Modems bereitgestellt. Jeder wird 10-20 Kunden behandeln.
Vorgeschlagene Lösung
Soweit ich weiß, ist MQTT eine übliche Lösung. Die Clients senden regelmäßig Daten an den Broker (dh Mosquitto, der auf dem Hosting-Server ausgeführt wird), der wiederum die Haupt-Web-App aktualisiert, die auf demselben Server ausgeführt wird.
Frage
Ist der MQTT-Ansatz für eine "große" Anzahl von Geräten (1000+) geeignet, von denen die meisten hinter einem 4G-Router stehen?
Antworten:
1.000 Kunden können problemlos von jedem anständigen MQTT-Broker bearbeitet werden. Es gibt einen Benchmark von Scalagent, der zeigt, dass ein PC mit:
konnte 60.000 Verlage mit Mosquitto behandeln. Dies ist weit mehr als Ihre erforderlichen 1.000 Publisher. Selbst auf einem relativ schwachen Server sollten Sie in der Lage sein, die erforderliche Anzahl zu verarbeiten.
Einige andere Broker behaupten eine noch bessere Leistung (natürlich mit entsprechend höherer Serverleistung ), wie beispielsweise HiveMQ , das behauptete, 10 Millionen Publisher zu verwalten.
MQTT-Broker erwarten im Allgemeinen eine dauerhafte Verbindung und setzen Clients, die keine Ping-Antworten (oder andere Aktivitäten) regelmäßig senden, eine Zeitüberschreitung zu. Sie könnten nach der Veröffentlichung die Verbindung zum Netzwerk trennen, aber dann können Sie natürlich nichts empfangen, wenn Sie die Verbindung trennen.
MQTT unterstützt das Konzept von "beibehaltenen" Nachrichten, die nützlich sein könnten. Der Webclient kann etwas zu einem Thema mit dem beibehaltenen Flag veröffentlichen, und diese Nachricht wird dann vom Broker gespeichert. Wenn Ihre Kunden das Thema erneut verbinden und abonnieren, erhalten sie die beibehaltene Nachricht (auch wenn sie vor Stunden veröffentlicht wurde). Die beibehaltene Nachricht wird jedes Mal veröffentlicht, wenn ein Client dieses Thema abonniert. Dies kann Ihnen helfen, wenn Sie eine uneinheitliche Verbindung haben und eine Nachricht speichern müssen, bis der Client erneut eine Verbindung herstellt.
quelle
Sie können dauerhafte Sitzungen von Clients verwenden, z. B. das Clean-Flag, das beim Verbinden auf false gesetzt wird. In diesem Szenario puffert der Broker, wenn Ihr Client offline ist, die Nachricht für ihn in den eigenen Cache und übermittelt sie, sobald das Gerät eine Verbindung herstellt.
Über die Menge - 10K ist selbst für einen Server eine relativ geringe Menge. Sie können den Linux-Server so konfigurieren, dass 500.000 aktive Verbindungen gespeichert werden. Wenn Ihr Broker Cloud-basiert ist, z. B. von einem Anbieter als Dienst bereitgestellt, können Sie sogar Millionen aktiver Verbindungen zu diesem Server halten.
Ich denke übrigens, Mosquitto oder eine andere lokale Installation ist die perfekte Wahl für Entwicklung und Test, aber wenn Sie in Produktion gehen, benötigen Sie einen SaaS MQTT-Broker mit allen Funktionen wie HA, Redundanz, Failover usw.
quelle