Condividi tramite


Eventi del ciclo di vita dei client MQTT

Gli eventi del ciclo di vita client consentono alle applicazioni di reagire agli eventi relativi allo stato della connessione client o alle operazioni delle risorse client. Consente di:

  • Monitorare lo stato della connessione dei client. Ad esempio, è possibile compilare un'applicazione che analizza le connessioni dei client per ottimizzare il comportamento.
  • Reagire con un'azione di mitigazione per le disconnessioni client. Ad esempio, è possibile compilare un'applicazione che avvia un flusso di mitigazione automatica o crea un ticket di supporto ogni volta che un client viene disconnesso.
  • Tenere traccia dello spazio dei nomi a cui sono collegati i client. Ad esempio, verificare che i client siano connessi allo spazio dei nomi corretto dopo l'avvio di un failover.

Tipi di evento

Lo spazio dei nomi griglia di eventi pubblica i tipi di evento seguenti:

Tipo di evento Descrizione
Microsoft.EventGrid.MQTTClientSession Connessione ed Pubblicato quando la sessione di un client MQTT è connessa a Griglia di eventi.
Microsoft.EventGrid.MQTTClientSessionDisconnected Pubblicato quando la sessione di un client MQTT viene disconnessa da Griglia di eventi.
Microsoft.EventGrid.MQTTClientCreatedOrUpdated Pubblicato quando un client MQTT viene creato o aggiornato nello spazio dei nomi di Griglia di eventi.
Microsoft.EventGrid.MQTTClientDeleted Pubblicato quando un client MQTT viene eliminato dallo spazio dei nomi di Griglia di eventi.

Schema di eventi

Gli eventi del ciclo di vita del client forniscono tutte le informazioni sul client e sulla sessione connesse o disconnesse. Fornisce anche una disconnessioneReason che è possibile usare per gli scenari di diagnostica in quanto consente di avere azioni di mitigazione automatizzate.

Questo evento di esempio mostra lo schema di un evento generato quando la sessione di un client MQTT è connessa a una Griglia di eventi:

[{
  "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
  }
}]

Questo evento di esempio mostra lo schema di un evento generato quando la sessione di un client MQTT viene disconnessa in Griglia di eventi:

[{
  "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"
  }
}]

Questo evento di esempio mostra lo schema di un evento generato quando viene creato o aggiornato un client MQTT nello spazio dei nomi di Griglia di eventi:

[{
  "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"
    }
  }
}]

Questo evento di esempio mostra lo schema di un evento generato quando un client MQTT viene eliminato dallo spazio dei nomi di Griglia di eventi:

[{
  "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"
  }
}]

Motivi di disconnessione:

L'elenco seguente illustra in dettaglio i diversi valori per disconnectionReason e la relativa descrizione:

Motivo disconnessione Descrizione
ClientAuthenticationError il client è stato disconnesso per qualsiasi motivo di autenticazione (ad esempio, certificato scaduto, client disabilitato o configurazione client modificato)
ClientAuthorizationError il client è stato disconnesso per qualsiasi motivo di autorizzazione(ad esempio, a causa di una modifica nella configurazione di spazi degli argomenti, associazioni di autorizzazioni o gruppi client)
ClientError il client ha inviato una richiesta non valida o ha usato una delle funzionalità non supportate che hanno generato una terminazione della connessione dal servizio.
ClientInitiatedDisconnect il client avvia una disconnessione normale tramite un pacchetto DISCONNECT per MQTT o un frame di chiusura per MQTT su WebSocket.
Connessione ionLost la connessione client-server viene persa.
IpForbidden L'indirizzo IP del client è bloccato dal filtro IP o dalla configurazione dei collegamenti privati.
QuotaExceeded il client ha superato uno o più limiti di limitazione che hanno causato una terminazione della connessione dal servizio.
ServerError la connessione è stata terminata a causa di un errore imprevisto del server
ServerInitiatedDisconnect il server avvia una disconnessione normale per qualsiasi motivo operativo
SessionOverflow la coda del client per i messaggi QoS1 non riconosciuti ha raggiunto il limite, che ha causato una terminazione della connessione dal server
SessionTakenOver il client si riconnette con lo stesso nome di autenticazione, che ha causato la chiusura della connessione precedente.

Per una descrizione dettagliata di ogni proprietà, vedere Schema di eventi per lo spazio dei nomi di Griglia di eventi.

Suggerimento

Gestione di una frequenza elevata di fluttuazioni negli stati di connessione: quando viene ricevuto un evento di disconnessione client, attendere un periodo (ad esempio, 30 secondi) e verificare che il client sia ancora offline prima di eseguire un'azione di mitigazione. Questa ottimizzazione migliora l'efficienza nella gestione degli stati in rapida evoluzione.

Configurazione

configurazione di portale di Azure

Usare la procedura seguente per generare gli eventi del ciclo di vita del client:

  1. Nello spazio dei nomi passare alla scheda Eventi.
  2. Selezionare +Sottoscrizione eventi.
    • Specificare un nome per la sottoscrizione di Griglia di eventi.
    • Selezionare lo schema eventi che si preferisce per l'utilizzo di eventi.
    • Filtrare gli eventi in Tipi di evento.
    • Compilare i dettagli dell'endpoint.
  3. Seleziona Crea.

Configurazione dell'interfaccia della riga di comando di Azure

Usare la procedura seguente per generare gli eventi del ciclo di vita del client:

  1. Creare un argomento di sistema
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. Creare una sottoscrizione di Griglia di eventi
  az eventgrid system-topic event-subscription create --name <Specify Event Subscription Name> -g <Resource Group> --system-topic-name <System Topic Name> --endpoint <Endpoint>

Comportamento:

  • Non esiste alcuna garanzia di latenza per gli eventi del ciclo di vita del client. Gli eventi di stato della connessione client indicano l'ultimo stato segnalato della connessione della sessione client, non lo stato della connessione in tempo reale.
  • È possibile pubblicare eventi duplicati del ciclo di vita del client.
  • Il timestamp degli eventi del ciclo di vita del client indica quando il servizio ha rilevato gli eventi, che possono differire dall'ora effettiva dell'evento.
  • L'ordine degli eventi del ciclo di vita del client non è garantito, gli eventi potrebbero arrivare non in ordine. Tuttavia, il numero di sequenza sugli eventi di stato della connessione può essere usato per determinare l'ordine originale degli eventi.
  • Per l'evento Client Created o Updated e l'evento Client Deleted:
    • Se sono presenti più modifiche dello stato alla risorsa client entro un breve periodo di tempo, verrà generato un evento per lo stato finale del client.
    • Esempio 1: se un client viene creato, quindi aggiornato due volte entro 3 secondi, EG genererà un solo evento MQTTClientCreatedOrUpdated con i valori finali per i metadati del client.
    • Esempio 2: se un client viene creato, quindi eliminato entro 5 secondi, EG genererà solo l'evento MQTTClientDeleted.

Ordinare gli eventi di stato della connessione:

Il numero di sequenza negli eventi MQTTClientSession Connessione ed e MQTTClientSessionDisconnected può essere usato per determinare l'ultimo stato segnalato della connessione della sessione client quando il numero di sequenza viene incrementato con ogni nuovo evento. Il numero di sequenza per MQTTClientSessionDisconnected corrisponde sempre al numero di sequenza dell'evento MQTTClientSession Connessione ed per la stessa connessione. Ad esempio, l'elenco di eventi e numeri di sequenza riportati di seguito è un esempio di eventi nell'ordine corretto per lo stesso client:

  • MQTTClientSession Connessione ed > "sequenceNumber": 1
  • MQTTClientSessionDisconnected > "sequenceNumber": 1
  • MQTTClientSession Connessione ed > "sequenceNumber": 2
  • MQTTClientSessionDisconnected > "sequenceNumber": 2

Ecco una logica di esempio per ordinare gli eventi: per ogni client:

  • Archiviare il numero di sequenza e lo stato della connessione dal primo evento.
  • Per ogni nuovo evento MQTTClientSession Connessione ed:
    • se il nuovo numero di sequenza è maggiore di quello precedente, aggiornare il numero di sequenza e lo stato della connessione in modo che corrisponda al nuovo evento.
  • Per ogni nuovo evento MQTTClientSessionDisconnected:
    • se il nuovo numero di sequenza è uguale o maggiore di quello precedente, aggiornare il numero di sequenza e lo stato della connessione in modo che corrisponda al nuovo evento.

Passaggi successivi