MQTT managé dans le cloud

Haute disponibilité d'un broker MQTT : concepts, conception des clients et questions à poser

La haute disponibilité MQTT est une responsabilité partagée entre le broker et les clients. Découvrez les concepts clés, le comportement à attendre lors d'un basculement, comment concevoir des clients résilients et les questions à poser à tout fournisseur.

Illustration de la haute disponibilité d'un broker MQTT, avec des appareils qui se reconnectent au broker après un basculement tout en mettant les messages en mémoire tampon localement
Essayez-le sur votre propre broker MQTTObtenez un broker MQTT privé et managé avec l’offre Free et partez d’exemples de code prêts à l’emploi.
Essayer gratuitement Exemples de code Aucune carte bancaire requise

La haute disponibilité d'un broker MQTT consiste à maintenir la communication entre appareils et applications lorsqu'une partie du système tombe en panne, et elle dépend autant de vos clients que du broker. Cet article explique les concepts clés, ce qui arrive réellement aux sessions et aux messages lors d'un basculement, comment concevoir des clients qui se rétablissent proprement, et quelles questions poser à tout fournisseur, ConnectMQ compris, avant de vous appuyer sur lui.

Ce que signifie la haute disponibilité pour MQTT

En termes d'infrastructure générale, la haute disponibilité consiste à concevoir un système de sorte que la défaillance d'un composant n'interrompe pas longtemps l'ensemble du service. Pour un broker MQTT, cela se décompose en trois questions distinctes :

  1. Les clients peuvent-ils se reconnecter rapidement ? Si le processus du broker, la machine ou le chemin réseau tombe en panne, combien de temps avant que les appareils puissent se reconnecter ?
  2. Qu'advient-il de l'état des sessions ? Les abonnements et les messages QoS 1 et 2 en file pour les clients hors ligne sont-ils préservés après la panne ?
  3. Qu'advient-il des messages en vol ? Les messages acceptés mais pas encore livrés sont-ils perdus, livrés une fois ou livrés deux fois ?

Les réponses varient selon les architectures, et un fournisseur excellent sur la première question peut ne rien promettre sur la troisième. Soyez précis sur celle dont vous avez besoin.

Les architectures de haute disponibilité courantes

Schéma Fonctionnement Ce qui survit à la panne d'un nœud Compromis
Nœud unique à redémarrage rapide Un broker, redémarré ou remplacé automatiquement en cas de panne La connectivité après redémarrage ; l'état dépend de la persistance Simple ; brève interruption pendant le redémarrage
Actif-passif Un nœud de secours prend le relais quand le principal tombe La connectivité ; l'état seulement s'il est répliqué ou sur un stockage partagé La capacité de secours reste inutilisée
Cluster actif-actif Plusieurs nœuds servent les clients et routent les messages entre eux La connectivité ; l'état si le cluster le réplique Plus complexe ; surcoût de coordination entre nœuds
Brokers partitionnés Brokers indépendants par site, tenant ou région Seule la partition défaillante est touchée Pas d'espace de topics global unique
Basculement côté client Les clients connaissent un endpoint principal et un secondaire La connectivité, si le secondaire est sain L'état n'est pas partagé entre les deux brokers

Aucun de ces schémas n'est universellement le meilleur. De nombreux systèmes IoT fiables utilisent un seul broker bien exploité par partition, associé à des clients résilients, car l'architecture la plus simple est celle qui offre le moins de façons de tomber en panne.

La place d'une offre managée

Soyons directs. ConnectMQ ne propose pas de clustering avec réplication des messages, et les sessions et messages en file ne sont pas conservés après un redémarrage du broker. Vous devez donc concevoir vos clients pour qu'ils tolèrent un redémarrage du broker en se reconnectant, en se réabonnant et en republiant tout ce qui est important, ce qui est de toute façon une bonne pratique sur n'importe quel broker.

En revanche, ConnectMQ offre pour la planification de la disponibilité un choix de modèles de déploiement. Une offre Dedicated vous donne un cluster isolé, de sorte que le trafic des autres tenants ne peut pas affecter le vôtre. BYOC exécute le broker dans votre propre compte cloud, géré par ConnectMQ, au sein de l'infrastructure, du réseau et des régions que vous maîtrisez déjà. Si vous avez besoin d'un objectif de disponibilité précis, discutez-en avec l'équipe pour un déploiement Dedicated ou BYOC plutôt que de supposer un chiffre.

Ce qui se passe lors d'un basculement

Lorsqu'un broker redémarre ou qu'un client est déplacé vers un autre nœud, la séquence typique est la suivante :

  1. La connexion TCP tombe. Le client le remarque immédiatement ou après son intervalle keepalive.
  2. Les autres abonnés reçoivent le message Last Will, si le broker le traite avant la panne, ou une mise à jour de statut plus tard.
  3. Le client se reconnecte avec une temporisation.
  4. Si le broker a toujours la session, le CONNACK indique que la session est présente et les abonnements sont intacts. Sinon, le client repart d'une session vierge et doit se réabonner.
  5. Les messages publiés pendant que le client était hors ligne ne sont livrés que si le broker les a conservés ; sinon, ils sont perdus.

La conclusion pratique : ne supposez jamais que l'étape 4 indique une session présente. Réabonnez-vous à chaque connexion, et conservez côté client tout ce que vous ne pouvez pas vous permettre de perdre jusqu'à son acquittement.

Concevoir des clients pour la haute disponibilité

Des clients résilients transforment un basculement du broker en simple accroc plutôt qu'en incident. Les schémas ci-dessous fonctionnent sur n'importe quel broker.

Se réabonner à chaque connexion

Placez les abonnements dans le callback de connexion, et non dans le code de démarrage, pour qu'ils soient rétablis après chaque reconnexion quel que soit l'état de la session.

Mettre en tampon localement jusqu'à l'acquittement

Pour les données importantes, conservez une file locale et ne retirez un élément qu'après l'acquittement par le broker d'une publication QoS 1. Notre guide store and forward MQTT couvre les tampons persistants sur les passerelles.

Basculer entre endpoints

Si vous exploitez plusieurs brokers, par exemple deux déploiements indépendants dans des lieux différents, le client peut alterner entre eux. Voici un exemple Python minimal avec paho-mqtt 2.x qui alterne les endpoints, se réabonne à la connexion et conserve en mémoire les messages non acquittés.

import json
import random
import threading
import time

import paho.mqtt.client as mqtt

ENDPOINTS = [("broker.connectmq.com", 8883), ("YOUR_SECONDARY_HOST", 8883)]
BASE = "acme/site1/line1/gw-01"
pending = {}              # mid -> (topic, payload), retiré une fois acquitté
lock = threading.Lock()

def send(client, topic, payload):
    with lock:
        info = client.publish(topic, payload, qos=1)
        pending[info.mid] = (topic, payload)

def on_connect(client, userdata, flags, reason_code, properties):
    if reason_code.is_failure:
        print("refused:", reason_code)
        return
    print("connected; session present:", flags.session_present)
    client.subscribe(f"{BASE}/cmd/#", qos=1)           # toujours se réabonner
    client.publish(f"{BASE}/status", "online", qos=1, retain=True)
    with lock:
        unacked = list(pending.values())
        pending.clear()
    for topic, payload in unacked:                       # renvoyer les données non acquittées
        send(client, topic, payload)

def on_publish(client, userdata, mid, reason_code, properties):
    with lock:
        pending.pop(mid, None)

def on_message(client, userdata, msg):
    print("command:", msg.topic, msg.payload.decode())

client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2,
                     client_id="YOUR_CLIENT_ID", protocol=mqtt.MQTTv5)
client.username_pw_set("YOUR_USERNAME", "YOUR_PASSWORD")
client.tls_set()
client.will_set(f"{BASE}/status", "offline", qos=1, retain=True)
client.on_connect = on_connect
client.on_publish = on_publish
client.on_message = on_message

index, delay = 0, 1
while True:
    host, port = ENDPOINTS[index % len(ENDPOINTS)]
    try:
        client.connect(host, port, keepalive=30)
    except OSError as exc:
        print(f"{host} unreachable: {exc}")
        index += 1
        time.sleep(delay + random.random())              # temporisation avec gigue
        delay = min(delay * 2, 60)
        continue
    delay = 1
    client.loop_start()
    time.sleep(2)                                        # attendre le CONNACK
    while client.is_connected():
        reading = json.dumps({"ts": int(time.time()), "rpm": 1480})
        send(client, f"{BASE}/telemetry", reading)
        time.sleep(5)
    client.loop_stop()
    print(f"lost {host}, trying the next endpoint")
    index += 1

En production, vous persisteriez pending sur disque et en plafonneriez la taille, mais la structure reste la même. Comme la QoS 1 autorise les doublons, les destinataires doivent tolérer qu'un message arrive deux fois après un basculement. Notez que chaque endpoint nécessite des identifiants valides pour ce broker.

Rendre les commandes idempotentes

Après un basculement, une commande QoS 1 peut arriver deux fois. Incluez un identifiant de commande et ignorez les doublons sur l'appareil.

Republier l'état plutôt que de compter sur le broker pour le conserver

Les messages retenus de statut et de configuration sont utiles, mais si le broker redémarre sans persistance, ils doivent être republiés. Faites republier l'état retenu par les appareils à chaque connexion, comme dans l'exemple.

Les questions à poser à tout fournisseur MQTT

Utilisez cette liste lors de vos évaluations et appels d'offres. Demandez des réponses écrites, et considérez toute réponse vague comme un « non ».

  1. Quelle est la topologie de déploiement de mon offre : nœud unique, actif-passif ou cluster ?
  2. Les sessions et les messages en file sont-ils conservés après un redémarrage du broker ?
  3. Les messages sont-ils répliqués entre nœuds avant d'être acquittés ?
  4. Comment les clients sont-ils redirigés après une panne : même nom d'hôte, changement DNS ou nouvel endpoint ?
  5. Quel est le délai de rétablissement typique après la panne d'un nœud, et est-il contractuel ?
  6. Existe-t-il un SLA publié, que couvre-t-il et quels sont les avoirs prévus ?
  7. Comment se déroulent la maintenance et les mises à niveau, et les clients sont-ils déconnectés ?
  8. Où se trouve la page de statut, et comment les incidents sont-ils communiqués ?
  9. Puis-je exécuter un déploiement dans un second lieu ou dans mon propre compte cloud ?
  10. Qu'advient-il de ma charge si un autre tenant se comporte mal sur une offre partagée ?

Pour notre propre service, la réponse aux questions 2 et 3 est que la persistance après redémarrage et la réplication des messages ne sont pas proposées, et pour les conditions de SLA, adressez-vous directement à l'équipe. Notre article sur le SLA d'un broker MQTT explique comment lire les clauses de SLA, et la checklist d'appel d'offres pour broker MQTT propose une liste d'évaluation plus longue.

Schémas pratiques de haute disponibilité sur un broker MQTT managé

En combinant les concepts ci-dessus, une approche réaliste pour la plupart des équipes ressemble à ceci :

  • Choisissez un broker MQTT managé pour que les correctifs, le TLS et les pannes matérielles soient l'affaire de quelqu'un d'autre.
  • Utilisez un déploiement Dedicated si vous avez besoin d'une isolation vis-à-vis des autres tenants.
  • Utilisez BYOC si le broker doit résider dans votre propre compte cloud, à côté de vos autres systèmes.
  • Partitionnez par site ou par client lorsqu'une panne ne doit pas affecter tout le monde.
  • Construisez chaque client avec réabonnement à la connexion, mise en tampon locale, commandes idempotentes et temporisation avec gigue.
  • Surveillez l'état des connexions, par exemple via $SYS/broker/connection/{clientId}/state, et déclenchez une alerte lorsque des appareils passent hors ligne.

Pour la capacité en complément de la disponibilité, consultez comment faire évoluer un broker MQTT, et pour une vue d'ensemble de l'hébergement, lisez le guide sur le broker MQTT cloud.

Planifiez la disponibilité de votre MQTT avec ConnectMQ

ConnectMQ est un broker MQTT managé avec des options Serverless, Dedicated et BYOC, pour que vous puissiez choisir le modèle de déploiement adapté à vos besoins de disponibilité. Vous pouvez d'abord observer la logique de reconnexion de vos clients sur le serveur MQTT public gratuit, réservé aux tests et jamais aux données de production. Commencez ensuite gratuitement sur app.connectmq.com, sans carte bancaire, développez des clients résilients avec ce broker, et contactez l'équipe lorsque vous avez besoin d'un déploiement Dedicated ou BYOC.

Questions fréquentes

MQTT intègre-t-il la haute disponibilité ?

Non. Le protocole MQTT définit les sessions, la QoS et le Last Will, mais la haute disponibilité dépend de la façon dont le broker est déployé et dont les clients gèrent les reconnexions.

Ma session MQTT survivra-t-elle à un redémarrage du broker ?

Seulement si le broker persiste les sessions. De nombreux déploiements, dont le nôtre, ne conservent pas les sessions après un redémarrage : les clients doivent donc se réabonner et republier l'état important à chaque connexion.

Un cluster est-il indispensable pour un système MQTT fiable ?

Pas toujours. Des clients bien conçus, des brokers partitionnés et des déploiements isolés offrent à de nombreux systèmes une grande fiabilité sans cluster répliqué.

Que demander à un fournisseur au sujet de la haute disponibilité d'un broker MQTT ?

Interrogez-le sur la topologie, la persistance des sessions, la réplication des messages, le comportement en cas de basculement, les fenêtres de maintenance et les conditions écrites du SLA. Obtenez les réponses par écrit avant de vous engager.

Articles liés

Broker MQTT BYOC : le modèle Bring Your Own Cloud expliqué

Un broker MQTT BYOC tourne dans votre compte cloud mais est exploité par un fournisseur. Découvrez le fonctionnement du modèle, la répartition des responsabilités et comment préparer votre compte.

9 min de lecture

Messages MQTT par seconde : comment estimer et mesurer le débit

La planification du débit MQTT se résume à quelques formules et à une mesure honnête. Découvrez comment estimer les messages entrants et sortants par seconde, tenir compte des pics et faire correspondre le résultat à une offre de broker.

8 min de lecture

Tous les articles →

Votre broker MQTT privé, à quelques clics

Créez un compte, récupérez les identifiants de votre broker et connectez votre premier appareil — aucun serveur à installer, mettre à jour ou dimensionner.