Zdarzenia cyklu życia klientów MQTT

Zdarzenia cyklu życia klienta umożliwiają aplikacjom reagowanie na zdarzenia dotyczące stanu połączenia klienta lub operacji zasobów klienta. Umożliwia to:

  • Monitoruj stan połączenia klientów. Można na przykład utworzyć aplikację, która analizuje połączenia klientów w celu optymalizacji zachowania.
  • React with a mitigation action for client disconnections .React with a mitigation action for client disconnections .React with a mitigation action for client disconnections (Reagowanie Można na przykład utworzyć aplikację, która inicjuje przepływ automatycznego ograniczania ryzyka lub tworzy bilet pomocy technicznej za każdym razem, gdy klient zostanie odłączony.
  • Śledź przestrzeń nazw dołączoną do klientów. Na przykład upewnij się, że klienci są połączeni z odpowiednią przestrzenią nazw po zainicjowaniu trybu failover.

Typy zdarzeń

Przestrzeń nazw usługi Event Grid publikuje następujące typy zdarzeń:

Typ zdarzenia Opis
Microsoft.EventGrid.MQTTClientSession Połączenie ed Opublikowano, gdy sesja klienta MQTT jest połączona z usługą Event Grid.
Microsoft.EventGrid.MQTTClientSessionDisconnected Opublikowane, gdy sesja klienta MQTT jest odłączona od usługi Event Grid.
Microsoft.EventGrid.MQTTClientCreatedOrUpdated Opublikowany po utworzeniu lub zaktualizowaniu klienta MQTT w przestrzeni nazw usługi Event Grid.
Microsoft.EventGrid.MQTTClientDeleted Opublikowane po usunięciu klienta MQTT z przestrzeni nazw usługi Event Grid.

Schemat zdarzeń

Zdarzenia cyklu życia klienta zawierają wszystkie informacje o kliencie i sesji, które zostały połączone lub rozłączone. Udostępnia on również wartość disconnectionReason, której można używać w scenariuszach diagnostycznych, ponieważ umożliwia automatyczne podejmowanie działań korygujących.

To przykładowe zdarzenie pokazuje schemat zdarzenia zgłoszonego, gdy sesja klienta MQTT jest połączona z usługą Event Grid:

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

To przykładowe zdarzenie pokazuje schemat zdarzenia zgłoszonego, gdy sesja klienta MQTT jest rozłączona z usługą Event Grid:

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

To przykładowe zdarzenie pokazuje schemat zdarzenia zgłoszonego podczas tworzenia lub aktualizowania klienta MQTT w przestrzeni nazw usługi Event Grid:

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

To przykładowe zdarzenie pokazuje schemat zdarzenia zgłoszonego po usunięciu klienta MQTT z przestrzeni nazw usługi Event Grid:

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

Przyczyny rozłączenia:

Poniższa lista zawiera szczegółowe informacje o różnych wartościach parametru disconnectionReason i ich opisie:

Przyczyna rozłączenia opis
Błąd ClientAuthenticationError klient został odłączony z przyczyn uwierzytelniania (na przykład certyfikat wygasł, klient został wyłączony lub zmieniono konfigurację klienta)
ClientAuthorizationError klient został odłączony z jakichkolwiek powodów autoryzacji (na przykład ze względu na zmianę konfiguracji przestrzeni tematów, powiązań uprawnień lub grup klientów)
Błąd klienta klient wysłał nieprawidłowe żądanie lub użył jednej z nieobsługiwanych funkcji, które spowodowały zakończenie połączenia przez usługę.
ClientInitiatedDisconnect klient inicjuje bezproblemowe rozłączenie za pośrednictwem pakietu DISCONNECT dla MQTT lub ramki zamknięcia protokołu MQTT za pośrednictwem protokołu WebSocket.
Połączenie ionLost połączenie klient-serwer zostanie utracone.
Adres IPForbidden adres IP klienta jest blokowany przez filtr IP lub konfigurację linków prywatnych.
QuotaExceeded klient przekroczył co najmniej jeden limit ograniczania przepustowości, który spowodował zakończenie połączenia przez usługę.
Błąd serwera połączenie zostało zakończone z powodu nieoczekiwanego błędu serwera
ServerInitiatedDisconnect serwer inicjuje bezproblemowe rozłączenie z dowolnego powodu operacyjnego
SesjaPrzepływ pracy kolejka klienta dla niezaznaczonych komunikatów QoS1 osiągnęła limit, co spowodowało zakończenie połączenia przez serwer
SessionTakenOver klient ponownie nawiązał połączenie z tą samą nazwą uwierzytelniania, co spowodowało zakończenie poprzedniego połączenia.

Aby uzyskać szczegółowy opis każdej właściwości, zobacz schemat zdarzeń dla przestrzeni nazw usługi Event Grid.

Napiwek

Obsługa wysokich wahań stanów połączenia: po odebraniu zdarzenia rozłączenia klienta poczekaj okres (na przykład 30 sekund) i sprawdź, czy klient jest nadal w trybie offline przed podjęciem akcji łagodzenia. Ta optymalizacja zwiększa wydajność obsługi szybko zmieniających się stanów.

Konfigurowanie

Konfiguracja witryny Azure Portal

Wykonaj następujące kroki, aby emitować zdarzenia cyklu życia klienta:

  1. W przestrzeni nazw przejdź do karty Zdarzenia.
  2. Wybierz pozycję +Subskrypcja zdarzeń.
    • Podaj nazwę subskrypcji usługi Event Grid.
    • Wybierz schemat zdarzeń, który jest preferowany do użycia zdarzeń.
    • Filtruj zdarzenia w obszarze Typy zdarzeń.
    • Wypełnij szczegóły punktu końcowego.
  3. Wybierz pozycję Utwórz.

Konfiguracja interfejsu wiersza polecenia platformy Azure

Wykonaj następujące kroki, aby emitować zdarzenia cyklu życia klienta:

  1. Tworzenie tematu systemowego
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. Tworzenie subskrypcji usługi 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>

Zachowanie:

  • Nie ma gwarancji opóźnienia dla zdarzeń cyklu życia klienta. Zdarzenia stanu połączenia klienta wskazują ostatni zgłoszony stan połączenia sesji klienta, a nie stan połączenia w czasie rzeczywistym.
  • Można opublikować zduplikowane zdarzenia cyklu życia klienta.
  • Sygnatura czasowa zdarzenia cyklu życia klienta wskazuje, kiedy usługa wykryła zdarzenia, co może różnić się od rzeczywistego czasu zdarzenia.
  • Kolejność zdarzeń cyklu życia klienta nie jest gwarantowana, zdarzenia mogą pojawić się poza kolejnością. Jednak numer sekwencji zdarzeń stanu połączenia może służyć do określenia oryginalnej kolejności zdarzeń.
  • W przypadku zdarzenia Klient utworzony lub zaktualizowany oraz zdarzenie Usunięte klienta:
    • Jeśli w krótkim czasie istnieje wiele zmian stanu zasobu klienta, zostanie wyemitowane jedno zdarzenie dla stanu końcowego klienta.
    • Przykład 1: jeśli klient zostanie utworzony, a następnie zaktualizowany dwa razy w ciągu 3 sekund, EG emituje tylko jedno zdarzenie MQTTClientCreatedOrUpdated z wartościami końcowymi metadanych klienta.
    • Przykład 2: jeśli klient zostanie utworzony, a następnie usunięty w ciągu 5 sekund, EG będzie emitować tylko zdarzenie MQTTClientDeleted.

Porządkowanie zdarzeń stanu połączenia:

Numer sekwencji w zdarzeniach MQTTClientSession Połączenie ed i MQTTClientSessionDisconnected może służyć do określenia ostatniego zgłoszonego stanu połączenia sesji klienta, ponieważ numer sekwencji jest zwiększany przy każdym nowym zdarzeniu. Numer sekwencji dla obiektu MQTTClientSessionDisconnected zawsze odpowiada numerowi sekwencji zdarzenia MQTTClientSession Połączenie ed dla tego samego połączenia. Na przykład poniższa lista zdarzeń i numerów sekwencji to próbka zdarzeń w odpowiedniej kolejności dla tego samego klienta:

  • MQTTClientSession Połączenie ed > "sequenceNumber": 1
  • MQTTClientSessionDisconnected > "sequenceNumber": 1
  • MQTTClientSession Połączenie ed > "sequenceNumber": 2
  • MQTTClientSessionDisconnected > "sequenceNumber": 2

Oto przykładowa logika do zamawiania zdarzeń: dla każdego klienta:

  • Zapisz numer sekwencji i stan połączenia z pierwszego zdarzenia.
  • Dla każdego nowego zdarzenia MQTTClientSession Połączenie ed:
    • Jeśli nowy numer sekwencji jest większy niż poprzedni, zaktualizuj numer sekwencji i stan połączenia, aby był zgodny z nowym zdarzeniem.
  • Dla każdego nowego zdarzenia MQTTClientSessionDisconnected:
    • jeśli nowy numer sekwencji jest równy lub większy niż poprzedni, zaktualizuj numer sekwencji i stan połączenia, aby był zgodny z nowym zdarzeniem.

Następne kroki