Teilen über


Ereignisse des MQTT-Clientlebenszyklus

Mit den Ereignissen des Client-Lebenszyklus können Anwendungen auf Ereignisse reagieren, die den Verbindungsstatus des Clients oder die Operationen der Client-Ressourcen betreffen. Die Funktion ermöglicht Folgendes:

  • Überwachen Sie den Verbindungsstatus Ihrer Clients. Sie können beispielsweise eine Anwendung erstellen, die die Verbindungen von Clients analysiert, um das Verhalten zu optimieren.
  • Reagieren Sie mit einer Entschärfungsmaßnahme für Verbindungsabbrüche von Clients. Sie können beispielsweise eine Anwendung erstellen, die einen Automatischen Entschärfungs-Flow initiiert oder jedes Mal ein Supportticket erstellt, wenn die Verbindung eines Clients getrennt wird.
  • Verfolgen Sie den Namespace, mit dem Ihre Clients verbunden sind. Vergewissern Sie sich beispielsweise, dass Ihre Clients mit dem richtigen Namespace verbunden sind, nachdem Sie ein Failover initiiert haben.

Ereignistypen

Der Event Grid-Namespace veröffentlicht die folgenden Ereignistypen:

Ereignistyp Beschreibung
Microsoft.EventGrid.MQTTClientSessionConnected Wird veröffentlicht, wenn die Sitzung eines MQTT-Clients mit Event Grid verbunden ist.
Microsoft.EventGrid.MQTTClientSessionDisconnected Wird veröffentlicht, wenn die Sitzung eines MQTT-Clients mit Event Grid getrennt wird.
Microsoft.EventGrid.MQTTClientCreatedOrUpdated Wird veröffentlicht, wenn ein MQTT-Client im Event Grid Namespace erstellt oder aktualisiert wird.
Microsoft.EventGrid.MQTTClientDeleted Wird veröffentlicht, wenn ein MQTT-Client aus dem Event Grid Namespace gelöscht wird.

Ereignisschema

Die Ereignisse des Clientlebenszyklus stellen alle Informationen zum Client und zur Sitzung bereit, die verbunden oder getrennt wurden. Es bietet auch einen disconnectionReason, den Sie für Diagnoseszenarien verwenden können, da es Ihnen ermöglicht, automatisierte Minderungsaktionen durchzuführen.

Dieses Beispielereignis zeigt das Schema eines Ereignisses, das ausgelöst wird, wenn die Sitzung eines MQTT-Clients mit Event Grid verbunden ist:

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

Dieses Beispielereignis zeigt das Schema eines Ereignisses, das ausgelöst wird, wenn die Sitzung eines MQTT-Clients mit Event Grid getrennt wird:

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

Dieses Beispielereignis zeigt das Schema eines Ereignisses, das ausgelöst wird, wenn ein MQTT-Client im Event Grid Namespace erstellt oder aktualisiert wird:

[{
  "specversion": "1.0",
  "id": "383d1562-c95f-4095-936c-688e72c6b2bb",
  "time": "2023-07-29T01:14:35.8928724Z",
  "type": "Microsoft.EventGrid.MQTTClientCreatedOrUpdated",
  "source": "/subscriptions/00000000-0000-0000-0000-000000000000/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"
    }
  }
}]

Dieses Beispielereignis zeigt das Schema eines Ereignisses, das ausgelöst wird, wenn ein MQTT-Client aus dem Event Grid Namespace gelöscht wird:

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

Gründe für die Trennung:

Die folgende Liste enthält die verschiedenen Werte für disconnectionReason (Grund für Trennung) und deren Beschreibung:

Grund für die Trennung BESCHREIBUNG
ClientAuthenticationError Der Client wurde aus Authentifizierungsgründen getrennt (z. B. Zertifikat abgelaufen, Client wurde deaktiviert oder Clientkonfiguration geändert).
ClientAuthorizationError Der Client wurde aus Autorisierungsgründen getrennt (z. B. aufgrund einer Änderung der Konfiguration von Themenbereichen, Berechtigungsbindungen oder Clientgruppen).
ClientError Der Client hat eine ungültige Anforderung gesendet oder eins der nicht unterstützten Features verwendet, die zu einer Verbindungsbeendigung durch den Dienst geführt haben.
ClientInitiatedDisconnect Der Client initiiert eine ordnungsgemäße Trennung über ein DISCONNECT-Paket für MQTT oder einen Close-Frame für MQTT über WebSocket.
ConnectionLost Die Client-Server-Verbindung wurde unterbrochen.
IpForbidden Die IP-Adresse des Clients wird durch den IP-Filter oder die Konfiguration privater Verbindungen blockiert.
QuotaExceeded Der Client hat mindestens einen der Drosselungsgrenzwerte überschritten, die zu einer Verbindungsbeendigung durch den Dienst geführt haben.
ServerError Die Verbindung wurde aufgrund eines unerwarteten Serverfehlers beendet.
ServerInitiatedDisconnect Der Server initiiert eine ordnungsgemäße Trennung aus einem beliebigen betriebsbedingten Grund.
SessionOverflow Die Warteschlange des Clients für nicht bestätigte QoS1-Nachrichten hat ihren Grenzwert erreicht, was zu einer Beendigung der Verbindung durch den Server geführt hat.
SessionTakenOver Der Client hat die Verbindung mit demselben Authentifizierungsnamen wiederhergestellt, was zur Beendigung der vorherigen Verbindung geführt hat.

Eine ausführliche Beschreibung der einzelnen Eigenschaften finden Sie unter Ereignisschema für Event Grid-Namespace.

Tipp

Behandeln hoher Schwankungen in Verbindungszuständen: Wenn ein Clienttrennungsereignis empfangen wird, warten Sie für einen bestimmten Zeitraum (z. B. 30 Sekunden lang), und überprüfen Sie dann, ob der Client noch offline ist, bevor Sie eine Minderungsaktion ausführen. Diese Optimierung verbessert die Effizienz bei der Behandlung von schnell wechselnden Zuständen.

Konfiguration

Konfiguration des Azure-Portals

Führen Sie die folgenden Schritte aus, um die Ereignisse des Clientlebenszyklus auszugeben:

  1. Navigieren Sie im Namespace zur Registerkarte „Ereignisse“.
  2. Wählen Sie „+ Ereignisabonnement“ aus.
    • Geben Sie einen Namen für Ihr Event Grid-Abonnement an.
    • Wählen Sie das Ereignisschema aus, das Sie für die Ereignisnutzung bevorzugen.
    • Filtern Sie die Ereignisse unter „Ereignistypen“.
    • Füllen Sie Ihre Endpunktdetails aus.
  3. Klicken Sie auf „Erstellen“.

Azure CLI-Konfiguration

Führen Sie die folgenden Schritte aus, um die Ereignisse des Clientlebenszyklus auszugeben:

  1. Erstellen eines Systemthemas
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. Erstellen eines Event Grid-Abonnements
  az eventgrid system-topic event-subscription create --name <Specify Event Subscription Name> -g <Resource Group> --system-topic-name <System Topic Name> --endpoint <Endpoint>

Verhalten:

  • Es gibt keine Latenzgarantie für die Lebenszyklusereignisse des Clients. Die Ereignisse zum Client-Verbindungsstatus zeigen den zuletzt gemeldeten Status der Verbindung der Client-Sitzung an, nicht den Echtzeit-Verbindungsstatus.
  • Es können doppelte Ereignisse im Lebenszyklus eines Client veröffentlicht werden.
  • Der Zeitstempel der Client-Lebenszyklus-Ereignisse gibt an, wann der Dienst die Ereignisse entdeckt hat, was vom tatsächlichen Zeitpunkt des Ereignisses abweichen kann.
  • Die Reihenfolge der Ereignisse im Lebenszyklus des Clients ist nicht garantiert, es kann sein, dass die Ereignisse nicht in der richtigen Reihenfolge eintreffen. Anhand der Sequenznummer auf den Ereignissen des Verbindungsstatus können Sie jedoch die ursprüngliche Reihenfolge der Ereignisse ermitteln.
  • Für das Ereignis „Client erstellt oder aktualisiert“ und das Ereignis „Client gelöscht“:
    • Wenn sich der Zustand der Client-Ressource innerhalb einer kurzen Zeitspanne mehrfach ändert, wird ein Ereignis für den endgültigen Zustand des Clients ausgelöst.
    • Beispiel 1: Wenn ein Client erstellt und dann zweimal innerhalb von 3 Sekunden aktualisiert wird, sendet EG nur ein MQTTClientCreatedOrUpdated-Ereignis mit den endgültigen Werten für die Metadaten des Clients.
    • Beispiel 2: Wenn ein Client erstellt und dann innerhalb von 5 Sekunden gelöscht wird, sendet EG nur das Ereignis MQTTClientDeleted.

Reihenfolge der Verbindungsstatusereignisse:

Die Sequenznummer für die Ereignisse MQTTClientSessionConnected und MQTTClientSessionDisconnected kann verwendet werden, um den letzten gemeldeten Zustand der Verbindung der Clientsitzung zu bestimmen, da die Sequenznummer mit jedem neuen Ereignis erhöht wird. Die Sequenznummer für mqTTClientSessionDisconnected stimmt immer mit der Sequenznummer des MQTTClientSessionConnected-Ereignisses für dieselbe Verbindung überein. Die folgende Liste der Ereignisse und Sequenznummern ist ein Beispiel für Ereignisse in der richtigen Reihenfolge für denselben Client:

  • MQTTClientSessionConnected > "sequenceNumber": 1
  • MQTTClientSessionDisconnected > "sequenceNumber": 1
  • MQTTClientSessionConnected > "sequenceNumber": 2
  • MQTTClientSessionDisconnected > "sequenceNumber": 2

Hier ist eine Beispiellogik zum Sortieren der Ereignisse: Für jeden Client:

  • Die Sequenznummer und den Verbindungsstatus des ersten Ereignisses speichern.
  • Für jedes neue MQTTClientSessionConnected-Ereignis:
    • Wenn die neue Sequenznummer größer ist als die vorherige, aktualisiere die Sequenznummer und den Verbindungsstatus entsprechend dem neuen Ereignis.
  • Für jedes neue MQTTClientSessionDisconnected-Ereignis:
    • Wenn die neue Sequenznummer gleich oder größer als die vorherige ist, aktualisieren Sie die Sequenznummer und den Verbindungsstatus entsprechend dem neuen Ereignis.

Nächste Schritte