MQTT est-il évolutif avec plus de 1000 clients?

10

Scénario
Périphérique IoT (actuellement le périphérique IPv4) qui envoie via le socket TCP une charge utile à un serveur une fois par jour. Le serveur a une adresse IP publique, l'appareil est derrière un routeur / NAT. Je vais utiliser un module basé sur ESP8266 (ie Olimex one)

Objectif
Le serveur doit pouvoir envoyer des données à n'importe quel client chaque fois qu'il en a besoin. Je ne suis pas intéressé par la communication directe de client à client (c'est-à-dire que je me connecte à un appareil depuis mon smartphone) comme la perforation est censée le faire.

Autres exigences
Les appareils IoT peuvent atteindre plusieurs milliers. Leur connexion Internet est fournie par de nombreux routeurs / modems compatibles 4G. Chacun traitera 10 à 20 clients.

Solution proposée
Pour autant que je sache, une solution courante est MQTT. Les clients envoient périodiquement des données au courtier (c'est-à-dire Mosquitto exécuté sur le serveur d'hébergement), qui à son tour met à jour l'application Web principale qui s'exécute sur le même serveur.

Question
L'approche MQTT convient-elle à un "grand" nombre d'appareils (1000+), la plupart derrière un routeur 4G?

marque
la source
Il pourrait être préférable de poser la question (1) séparément et de simplement poser la question (2) qui correspond à votre titre dans le corps de la question. De cette façon, nous pouvons répondre à chacune de vos questions séparément en détail. Vous pouvez inclure à nouveau votre contexte dans la nouvelle question ou créer un lien vers celle-ci si cela vous aide.
Aurora0001
1
La question a changé et a ajouté la deuxième.
Mark
D'après le son, même si vous rencontriez des problèmes de charge de serveur avec un nombre élevé de connexions ouvertes, votre système serait tout à fait compatible avec un type d'arborescence de topologie où les clients se connectent à des serveurs intermédiaires qui détiennent les sessions correspondantes et passent plutôt trafic peu fréquent de haut en bas vers des serveurs supérieurs dans un seul canal chacun. Vous pourriez probablement même faire le premier niveau de cela localement dans vos routeurs 4G.
Chris Stratton

Réponses:

7

1 000 clients peuvent être facilement traités par n'importe quel courtier MQTT décent; il y a une référence de Scalagent qui montre qu'un PC avec:

  • un processeur Intel Core 2 Duo 3 GHz
  • 4 Go de RAM

pourrait gérer 60 000 éditeurs exécutant Mosquitto. Cela dépasse largement les 1 000 éditeurs requis, donc même sur un serveur relativement faible, vous devriez toujours être en mesure de gérer le nombre requis.

Certains autres courtiers revendiquent des performances encore meilleures (avec une puissance de serveur proportionnellement supérieure, bien sûr), comme HiveMQ , qui prétendait gérer 10 millions d' éditeurs.

Les courtiers MQTT s'attendent généralement à une connexion persistante et expireront les clients qui n'envoient pas de réponses ping (ou autre activité) périodiquement. Vous pouvez vous déconnecter du réseau après la publication, mais, évidemment, vous ne pourrez plus rien recevoir si vous vous déconnectez.

MQTT prend en charge le concept de messages «retenus» qui pourraient être utiles. Le client Web peut publier quelque chose dans une rubrique avec l'indicateur conservé, et ce message sera ensuite stocké par le courtier. Chaque fois que vos clients se reconnectent et s'abonnent au sujet, ils recevront alors le message conservé (même s'il a été publié il y a des heures). Le message conservé est publié chaque fois qu'un client s'abonne à cette rubrique, ce qui peut vous aider si vous avez une connexion inégale et avez besoin d'un message à stocker jusqu'à ce que le client se reconnecte.

Aurora0001
la source
Je l'ai sûrement mal expliqué. Seul le serveur (service d'hébergement commercial) doit gérer les 1000+ clients. Il existe de nombreux routeurs 4G à différents endroits et chacun ne traitera que 10 à 20 clients.
Mark
Oh, j'ai mal lu - ma faute, @Mark, j'ai supposé que vous les vouliez tous derrière un routeur 4G. Je vais modifier cela dans ce cas.
Aurora0001
Je ne comprends pas encore complètement le code sous-jacent de MQTT - j'avais peur des connexions 4G: le MQTT nécessite-t-il une connexion Internet persistante? Le réseau sera probablement instable ...
Mark
J'ai édité avec quelques suggestions, @Mark; faites-moi savoir si cela vous indique la bonne direction.
Aurora0001
1
Oui, c'est plus clair maintenant. Je vais faire d'autres recherches sur ce sujet et si j'ai encore besoin d'aide, je poserai une autre question. Merci beaucoup.
Mark
5

Vous pouvez utiliser des sessions persistantes de clients, par exemple un indicateur de nettoyage défini sur false lors de la connexion. Dans cet événement de scénario lorsque votre client est hors ligne, le courtier stocke le message dans son propre cache et le remet une fois que l'appareil se connecte.

À propos de la quantité - 10K est une quantité relativement faible, même pour un serveur. Vous pouvez configurer le serveur Linux pour contenir 500 000 connexions actives et si votre courtier sera basé sur le cloud, par exemple fourni en tant que service par un fournisseur, vous pouvez alors détenir même des millions de connexions actives.

Soit dit en passant, je pense que Mosquitto ou toute autre installation locale est un choix parfait pour le développement et les tests, mais lorsque vous entrerez en production, vous aurez besoin du courtier SaaS MQTT avec toutes les fonctionnalités telles que HA, la redondance, le basculement, etc.

châle
la source
Je ne pense pas qu'un courtier SaaS MQTT soit toujours le meilleur pour la production. La plupart des courtiers MQTT professionnels (auto-hébergés) prennent en charge la haute disponibilité, la redondance et le basculement à grande échelle tout en conservant une compatibilité MQTT complète. Certains courtiers SaaS ne prennent pas en charge toutes les fonctionnalités MQTT. Si vous testez contre un moustique local, puis allez chez un fournisseur SaaS, il est probable que les choses ne fonctionnent pas comme prévu.
Dominik Obermaier
Comme d'habitude, les deux options présentent des avantages et des inconvénients. Il est évident que tout courtier SaaS nécessite une équipe de communication parfaite, des tests à long terme sur les premiers stades du développement du produit, des garanties de disponibilité claires et divers SLA. Le maintien de son propre courtier est également une bonne façon, mais le monde se tourne vers les services. Soit vous déploierez des efforts et serez le plus compétent avec votre produit qui utilise le courtier dans le cadre de celui-ci, soit vous dépenserez du temps et de l'argent pour être un administrateur de courtier MQTT super expérimenté (et ne serez jamais son développeur!). Juste une question de choix +)
shal