Événements de cycle de vie des clients MQTT

Les événements du cycle de vie du client permettent aux applications de réagir aux événements concernant l'état de la connexion du client ou les opérations des ressources du client. Vous pouvez ainsi :

  • Surveillez l’état de connexion de vos clients. Par exemple, vous pouvez créer une application qui analyse les connexions des clients pour optimiser leur comportement.
  • Réagissez avec une action d'atténuation pour les déconnexions des clients. Par exemple, vous pouvez créer une application qui lance un flux d'atténuation automatique ou crée un ticket de support chaque fois qu'un client est déconnecté.
  • Suivez l'espace de noms auquel vos clients sont attachés. Par exemple, vérifiez que vos clients sont connectés au bon espace de noms après avoir lancé un basculement.

Types d’événements

L’espace de noms Event Grid publie les types d’événements suivants :

Type d’événement Description
Microsoft.EventGrid.MQTTClientSessionConnected Publié quand la session d’un client MQTT est connectée à Event Grid.
Microsoft.EventGrid.MQTTClientSessionDisconnected Publié quand la session d’un client MQTT est déconnectée d’Event Grid.
Microsoft.EventGrid.MQTTClientCreatedOrUpdated Publié lorsqu’un client MQTT est créé ou mis à jour dans l’espace de noms Event Grid.
Microsoft.EventGrid.MQTTClientDeleted Publié lorsqu’un client MQTT est supprimé de l’espace de noms Event Grid.

Schéma d’événement

Les événements de cycle de vie du client vous fournissent toutes les informations sur le client et la session connectés ou déconnectés. Il fournit également une disconnectionReason que vous pouvez utiliser pour les scénarios de diagnostic, car il vous permet de disposer d'actions d'atténuation automatisées.

Cet exemple d’événement montre le schéma d’un événement déclenché lorsque la session d’un client MQTT est connectée à Event Grid :

[{
  "specversion": "1.0",
  "id": "5249c38a-a048-46dd-8f60-df34fcdab06c",
  "time": "2023-07-29T01:23:49.6454046Z",
  "type": "Microsoft.EventGrid.MQTTClientSessionConnected",
  "source": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/myrg/providers/Microsoft.EventGrid/namespaces/myns",
  "subject": "clients/client1/sessions/session1",
  "data": {
    "namespaceName": "myns",
    "clientAuthenticationName": "client1",
    "clientSessionName": "session1",
    "sequenceNumber": 1
  }
}]

Cet exemple d’événement montre le schéma d’un événement déclenché lorsque la session d’un client MQTT est déconnectée d’Event Grid :

[{
  "specversion": "1.0",
  "id": "e30e5174-787d-4e19-8812-580148bfcf7b",
  "time": "2023-07-29T01:27:40.2446871Z",
  "type": "Microsoft.EventGrid.MQTTClientSessionDisconnected",
  "source": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/myrg/providers/Microsoft.EventGrid/namespaces/myns",
  "subject": "clients/client1/sessions/session1",
  "data": {
    "namespaceName": "myns",
    "clientAuthenticationName": "client1",
    "clientSessionName": "session1",
    "sequenceNumber": 1,
    "disconnectionReason": "ClientInitiatedDisconnect"
  }
}]

Cet exemple d’événement montre le schéma d’un événement déclenché lorsqu’un client MQTT est créé ou mis à jour dans l’espace de noms Event Grid :

[{
  "specversion": "1.0",
  "id": "383d1562-c95f-4095-936c-688e72c6b2bb",
  "time": "2023-07-29T01:14:35.8928724Z",
  "type": "Microsoft.EventGrid.MQTTClientCreatedOrUpdated",
  "source": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/myrg/providers/Microsoft.EventGrid/namespaces/myns",
  "subject": "clients/client1",
  "data": {
    "createdOn": "2023-07-29T01:14:34.2048108Z",
    "updatedOn": "2023-07-29T01:14:34.2048108Z",
    "namespaceName": "myns",
    "clientName": "client1",
    "clientAuthenticationName": "client1",
    "state": "Enabled",
    "attributes": {
      "attribute1": "value1"
    }
  }
}]

Cet exemple d’événement montre le schéma d’un événement déclenché lorsqu’un client MQTT est supprimé de l’espace de noms Event Grid :

[{
  "specversion": "1.0",
  "id": "2a93aaf9-66c2-4f8e-9ba3-8d899c10bf17",
  "time": "2023-07-29T01:30:52.5620566Z",
  "type": "Microsoft.EventGrid.MQTTClientDeleted",
  "source": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/myrg/providers/Microsoft.EventGrid/namespaces/myns",
  "subject": "clients/client1",
  "data": {
    "namespaceName": "myns",
    "clientName": "client1",
    "clientAuthenticationName": "client1"
  }
}]

Raisons de la déconnexion :

La liste suivante détaille les différentes valeurs de disconnectionReason et leur description :

Raison de la déconnexion Description
ClientAuthenticationError le client a été déconnecté pour des raisons d’authentification (par exemple, le certificat a expiré, le client a été désactivé ou la configuration du client a été modifiée)
ClientAuthorizationError le client a été déconnecté pour des raisons d’autorisation (par exemple, en raison d’une modification de la configuration des espaces de rubrique, des liaisons d’autorisation ou des groupes de clients)
ClientError le client a envoyé une demande incorrecte ou utilisé l’une des fonctionnalités non prises en charge qui a entraîné l’arrêt de la connexion par le service.
ClientInitiatedDisconnect le client initie une déconnexion normale via un paquet DISCONNECT pour MQTT ou un cadre fermé pour MQTT sur WebSocket.
ConnectionLost la connexion client-serveur est perdue.
IpForbidden l’adresse IP du client est bloquée par le filtre IP ou la configuration des liaisons privées.
QuotaExceeded le client a dépassé une ou plusieurs des limites de limitation qui ont entraîné l’arrêt de la connexion par le service.
ServerError la connexion a été interrompue en raison d’une erreur de serveur inattendue
ServerInitiatedDisconnect le serveur lance une déconnexion normale pour n’importe quelle raison opérationnelle
SessionOverflow la file d’attente du client pour les messages QoS1 non acquittés a atteint sa limite, ce qui a entraîné l’arrêt de la connexion par le serveur
SessionTakenOver le client s’est reconnecté avec le même nom d’authentification, ce qui a entraîné l’arrêt de la connexion précédente.

Pour obtenir une description détaillée de chaque propriété, consultez Schéma d’événement espace de noms Event Grid.

Conseil

Gestion d'un taux élevé de fluctuations dans les états de connexion : Lorsqu'un événement de déconnexion d'un client est reçu, attendez un certain temps (par exemple, 30 secondes) et vérifiez que le client est toujours hors ligne avant de prendre une mesure d'atténuation. Cette optimisation améliore l’efficacité de la gestion des états en évolution rapide.

Configuration

Configuration du portail Azure

Pour émettre les événements de cycle de vie du client, procédez comme suit :

  1. Dans l’espace de noms, accédez à l’onglet Événements.
  2. Sélectionnez + Abonnement aux événements.
    • Fournissez un nom pour votre abonnement Event Grid.
    • Sélectionnez le schéma d’événement que vous préférez pour la consommation d’événements.
    • Filtrez les événements sous Types d’événements.
    • Renseignez les détails de votre point de terminaison.
  3. Sélectionnez Créer.

Configuration d’Azure CLI

Pour émettre les événements de cycle de vie du client, procédez comme suit :

  1. Créer une rubrique système
az eventgrid system-topic create --resource-group <Resource Group > --name <System Topic Name> --location \<Region> --topic-type Microsoft.EventGrid.Namespaces --source /subscriptions//resourceGroups/<Resource Group >/providers/Microsoft.EventGrid/namespaces/<Namespace Name>
  1. Créer un abonnement Event Grid
  az eventgrid system-topic event-subscription create --name <Specify Event Subscription Name> -g <Resource Group> --system-topic-name <System Topic Name> --endpoint <Endpoint>

Comportement :

  • Il n'y a aucune garantie de latence pour les événements du cycle de vie du client. Les événements d'état de connexion client indiquent le dernier état signalé de la connexion de la session client, et non l'état de connexion en temps réel.
  • Des événements de cycle de vie client en double peuvent être publiés.
  • L'horodatage des événements du cycle de vie du client indique quand le service a détecté les événements, ce qui peut différer de l'heure réelle de l'événement.
  • L'ordre des événements du cycle de vie du client n'est pas garanti, les événements peuvent arriver dans le désordre. Cependant, le numéro de séquence sur les événements d'état de connexion peut être utilisé pour déterminer l'ordre d'origine des événements.
  • Pour l’événement créé ou mis à jour du client et l’événement supprimé du client :
    • S'il y a plusieurs changements d'état de la ressource client dans un court laps de temps, un événement sera émis pour l'état final du client.
    • Exemple 1 : si un client est créé, puis mis à jour deux fois en 3 secondes, EG n'émettra qu'un seul événement MQTTClientCreatedOrUpdated avec les valeurs finales des métadonnées du client.
    • Exemple 2 : si un client est créé, puis supprimé dans les 5 secondes, EG n'émettra que l'événement MQTTClientDeleted.

Événements d’état de connexion de la commande :

Le numéro de séquence sur les événements MQTTClientSessionConnected et MQTTClientSessionDisconnected peut être utilisé pour déterminer le dernier état signalé de la connexion de la session client, car le numéro de séquence est incrémenté à chaque nouvel événement. Le numéro de séquence de MQTTClientSessionDisconnected correspond toujours au numéro de séquence de l'événement MQTTClientSessionConnected pour la même connexion. Par exemple, la liste des événements et des numéros de séquence ci-dessous est un échantillon d'événements dans le bon ordre pour le même client :

  • MQTTClientSessionConnected > « numéro de séquence » : 1
  • MQTTClientSessionDisconnected > "sequenceNumber": 1
  • MQTTClientSessionConnected > « numéro de séquence » : 2
  • MQTTClientSessionDisconnected > "sequenceNumber": 2

Voici un exemple de logique pour classer les événements : Pour chaque client :

  • Stockez le numéro de séquence et l’état de connexion du premier événement.
  • Pour chaque nouvel événement MQTTClientSessionConnected :
    • si le nouveau numéro de séquence est supérieur au précédent, mettez à jour le numéro de séquence et l'état de connexion pour qu'ils correspondent au nouvel événement.
  • Pour chaque nouvel événement MQTTClientSessionDisconnected :
    • si le nouveau numéro de séquence est égal ou supérieur à celui précédent, mettez à jour le numéro de séquence et l’état de connexion pour qu’il corresponde au nouvel événement.

Étapes suivantes