События жизненного цикла клиентов MQTT

События жизненного цикла клиента позволяют приложениям реагировать на события о состоянии подключения клиента или операциях ресурсов клиента. Оно предоставляет следующие возможности.

  • Отслеживайте состояние подключения клиентов. Например, можно создать приложение, которое анализирует подключения клиентов для оптимизации поведения.
  • React с действием по устранению рисков для отключений клиентов. Например, можно создать приложение, которое инициирует поток автоматического устранения рисков или создает запрос в службу поддержки при каждом отключении клиента.
  • Отслеживайте пространство имен, к которому подключены ваши клиенты. Например, убедитесь, что клиенты подключены к нужному пространству имен после запуска отработки отказа.

Типы событий

Пространство имен Сетки событий публикует следующие типы событий:

Тип события Description
Microsoft.EventGrid.MQTTClientSession Подключение Опубликовано при подключении сеанса клиента MQTT к сетке событий.
Microsoft.EventGrid.MQTTClientSessionDisconnected Опубликовано при отключении сеанса клиента MQTT от сетки событий.
Microsoft.EventGrid.MQTTClientCreatedOrUpdated Опубликовано при создании или обновлении клиента MQTT в пространстве имен сетки событий.
Microsoft.EventGrid.MQTTClientDeleted Опубликовано при удалении клиента MQTT из пространства имен сетки событий.

Схема событий

События жизненного цикла клиента предоставляют все сведения о клиенте и сеансе, которые были подключены или отключены. Он также предоставляет отключениеReason, который можно использовать для диагностика сценариев, так как позволяет выполнять автоматизированные действия по устранению рисков.

В этом примере события показана схема события, возникающего при подключении сеанса клиента MQTT к сетке событий:

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

В этом примере события показана схема события, возникающего при отключении сеанса клиента MQTT к сетке событий:

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

В этом примере события показана схема события, возникающего при создании или обновлении клиента MQTT в пространстве имен сетки событий:

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

В этом примере события показана схема события, возникающего при удалении клиента MQTT из пространства имен сетки событий:

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

Причины отключения:

В следующем списке приведены различные значения для отключенияReason и их описание:

Причина отключения Description
ClientAuthenticationError клиент был отключен по любым причинам проверки подлинности (например, срок действия сертификата истек, клиент отключен или изменена конфигурация клиента).
ClientAuthorizationError Клиент был отключен по каким-либо причинам авторизации (например, из-за изменения конфигурации пространств разделов, привязок разрешений или групп клиентов)
ClientError Клиент отправил неправильный запрос или использовал одну из неподдерживаемых функций, которые привели к прекращению подключения службой.
ClientInitiatedDisconnect Клиент инициирует корректное отключение с помощью пакета DISCONNECT для MQTT или близкого кадра для MQTT через WebSocket.
Подключение ionLost Подключение к клиентскому серверу потеряно.
IpForbidden IP-адрес клиента блокируется фильтром IP-адресов или конфигурацией приватных ссылок.
QuotaExceeded Клиент превысил один или несколько ограничений регулирования, которые привели к прекращению подключения службой.
ServerError подключение было завершено из-за непредвиденной ошибки сервера
ServerInitiatedDisconnect Сервер инициирует корректное отключение по любой операционной причине.
SessionOverflow очередь клиента для ненавзированных сообщений QoS1 достигла предела, что привело к прекращению подключения сервером
SessionTakenOver клиент повторно подключился с тем же именем проверки подлинности, что привело к прекращению предыдущего подключения.

Подробное описание каждого свойства см . в схеме событий для пространства имен сетки событий.

Совет

Обработка высокой частоты колебаний состояний подключения: при получении события отключения клиента подождите период (например, 30 секунд) и убедитесь, что клиент по-прежнему находится в автономном режиме перед принятием действия по устранению неполадок. Эта оптимизация повышает эффективность обработки быстро изменяющихся состояний.

Настройка

Настройка портала Azure

Чтобы вывести события жизненного цикла клиента, выполните следующие действия.

  1. В пространстве имен перейдите на вкладку "События".
  2. Выберите +Подписка на события.
    • Укажите имя подписки сетки событий.
    • Выберите схему событий, которую вы предпочитаете для потребления событий.
    • Фильтрация событий в типах событий.
    • Заполните сведения о конечной точке.
  3. Нажмите кнопку создания.

Настройка Azure CLI

Чтобы вывести события жизненного цикла клиента, выполните следующие действия.

  1. Создание системного раздела
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. Создание подписки сетки событий
  az eventgrid system-topic event-subscription create --name <Specify Event Subscription Name> -g <Resource Group> --system-topic-name <System Topic Name> --endpoint <Endpoint>

Модель поведения:

  • Нет гарантии задержки для событий жизненного цикла клиента. События состояния подключения клиента указывают последнее состояние подключения сеанса клиента, а не состояние подключения в режиме реального времени.
  • Могут быть опубликованы повторяющиеся события жизненного цикла клиента.
  • Метка времени жизненного цикла клиента указывает, когда служба обнаружила события, которые могут отличаться от фактического времени события.
  • Порядок событий жизненного цикла клиента не гарантируется, события могут поступать из порядка. Однако порядковый номер событий состояния подключения можно использовать для определения исходного порядка событий.
  • Для события создания или обновления клиента и события удаления клиента:
    • Если в течение короткого периода времени в ресурсе клиента изменяется несколько состояний, то для окончательного состояния клиента будет возникать одно событие.
    • Пример 1. Если клиент создается, то обновляется дважды в течение 3 секунд, EG выдает только одно событие MQTTClientCreatedOrUpdated с конечными значениями метаданных клиента.
    • Пример 2. Если клиент создается, то удаляется в течение 5 секунд, EG выдает только событие MQTTClientDeleted.

Упорядочить события состояния подключения:

Порядковый номер для событий MQTTClientSession Подключение ed и MQTTClientSessionDisconnected можно использовать для определения последнего состояния подключения сеанса клиента, так как порядковый номер увеличивается с каждым новым событием. Порядковый номер для MQTTClientSessionDisconnected всегда совпадает с порядковым номером события MQTTClientSession Подключение ed для того же подключения. Например, список событий и порядковых номеров ниже — это пример событий в правильном порядке для того же клиента:

  • MQTTClientSession Подключение ed > "sequenceNumber": 1
  • MQTTClientSessionDisconnected > "sequenceNumber": 1
  • MQTTClientSession Подключение ed > "sequenceNumber": 2
  • MQTTClientSessionDisconnected > "sequenceNumber": 2

Ниже приведен пример логики для упорядочивания событий: для каждого клиента:

  • Сохраните порядковый номер и состояние подключения из первого события.
  • Для каждого нового события MQTTClientSession Подключение ed:
    • Если новый номер последовательности больше предыдущего, обновите номер последовательности и состояние подключения, чтобы соответствовать новому событию.
  • Для каждого нового события MQTTClientSessionDisconnected:
    • Если новый номер последовательности равен или больше предыдущего, обновите номер последовательности и состояние подключения, чтобы соответствовать новому событию.

Следующие шаги